home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / Online / Term / Extras / Source / term-source.lha / ARexxAttributes.c < prev    next >
C/C++ Source or Header  |  1996-10-20  |  90KB  |  4,993 lines

  1. /*
  2. **    ARexxAttributes.c
  3. **
  4. **    ARexx interface attribute handling routines
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. **
  9. **    :ts=4
  10. */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "Global.h"
  14. #endif
  15.  
  16.     /* ToBoolean(LONG Value):
  17.      *
  18.      *    Map an index value to a boolean string.
  19.      */
  20.  
  21. STATIC STRPTR
  22. ToBoolean(LONG Value)
  23. {
  24.     if(Value)
  25.         return(BooleanMappings[1]);
  26.     else
  27.         return(BooleanMappings[0]);
  28. }
  29.  
  30.     /* FromBoolean(STRPTR Value):
  31.      *
  32.      *    Map a boolean value to an index value.
  33.      */
  34.  
  35. STATIC LONG
  36. FromBoolean(STRPTR Value)
  37. {
  38.     STATIC STRPTR BoolTrueMappings[] =
  39.     {
  40.         "TRUE",
  41.         "ON",
  42.         "YES",
  43.         "ENABLED",
  44.         "AVAILABLE",
  45.         NULL
  46.     };
  47.  
  48.     LONG i;
  49.  
  50.     for(i = 0 ; BoolTrueMappings[i] ; i++)
  51.     {
  52.         if(!Stricmp(Value,BoolTrueMappings[i]))
  53.             return(TRUE);
  54.     }
  55.  
  56.     return(FALSE);
  57. }
  58.  
  59.     /* ToMap(LONG Index,STRPTR *Mappings):
  60.      *
  61.      *    Map an index to a string.
  62.      */
  63.  
  64. STATIC STRPTR
  65. ToMap(LONG Index,STRPTR *Mappings)
  66. {
  67.     LONG i;
  68.  
  69.     for(i = 0 ; Mappings[i] ; i++)
  70.     {
  71.         if(Index == i)
  72.             return(Mappings[i]);
  73.     }
  74.  
  75.     return(Mappings[0]);
  76. }
  77.  
  78.     /* FromMap(STRPTR String,STRPTR *Mappings):
  79.      *
  80.      *    Map a string to an index number.
  81.      */
  82.  
  83. STATIC LONG
  84. FromMap(STRPTR String,STRPTR *Mappings)
  85. {
  86.     LONG i;
  87.  
  88.     for(i = 0 ; Mappings[i] ; i++)
  89.     {
  90.         if(!Stricmp(String,Mappings[i]))
  91.             return(i);
  92.     }
  93.  
  94.     return(-1);
  95. }
  96.  
  97.     /* ToIndex(STRPTR Name,WORD *Count1,WORD *Count2):
  98.      *
  99.      *    Turn an index name into an index and count key.
  100.      */
  101.  
  102. STATIC LONG
  103. ToIndex(STRPTR Name,WORD *Count1,WORD *Count2)
  104. {
  105.     BOOL FoundIt,NodeIsNumeric;
  106.     LONG i,Level,Top,Index;
  107.     UBYTE NodeName[40];
  108.  
  109.     Level    = 0;
  110.     Top        = 0;
  111.     Index    = -1;
  112.     FoundIt    = FALSE;
  113.  
  114.         /* Reset counter variables. */
  115.  
  116.     *Count1 = *Count2 = -1;
  117.  
  118.         /* Skip leading blank spaces. */
  119.  
  120.     while(*Name == ' ' || *Name == '\t')
  121.         Name++;
  122.  
  123.         /* Scan until end of string found. */
  124.  
  125.     while(*Name)
  126.     {
  127.             /* Get the node name. */
  128.  
  129.         i = 0;
  130.  
  131.         while(*Name != '.' && *Name != ' ' && *Name != '\t' && *Name)
  132.             NodeName[i++] = *Name++;
  133.  
  134.         NodeName[i] = 0;
  135.  
  136.         DB(kprintf("node name is |%s|\n",NodeName));
  137.  
  138.             /* Is the name really a number? */
  139.  
  140.         NodeIsNumeric = IsNumeric(NodeName);
  141.  
  142.         DB(kprintf("node name numeric = %ld\n",NodeIsNumeric));
  143.  
  144.             /* Skip any trailing spaces. */
  145.  
  146.         while(*Name == ' ' || *Name == '\t')
  147.             Name++;
  148.  
  149.             /* Is a component name to follow? */
  150.  
  151.         if(*Name == '.')
  152.         {
  153.                 /* Skip dot and trailing spaces. */
  154.  
  155.             do
  156.                 Name++;
  157.             while(*Name == ' ' || *Name == '\t');
  158.         }
  159.         else
  160.             Name = "";    /* Last iteration. */
  161.  
  162.             /* Try to find the corresponding keyword in the tree. */
  163.  
  164.         FoundIt = FALSE;
  165.  
  166.         DB(kprintf("level is %ld\n",Level));
  167.  
  168.         for(i = Top ; i < AttributeTableSize ; i++)
  169.         {
  170.                 /* Is it on the same tree level? Note: code will
  171.                  * scan into the branches but will not move back up
  172.                  * in the tree.
  173.                  */
  174.  
  175.             if(AttributeTable[i].Level == Level)
  176.             {
  177.                     /* Is a keyword required? */
  178.  
  179.                 if(AttributeTable[i].Name)
  180.                 {
  181.                         /* Does the name match? */
  182.  
  183.                     if(!Stricmp(AttributeTable[i].Name,NodeName))
  184.                     {
  185.                         DB(kprintf("matching name found\n"));
  186.  
  187.                             /* Remember new anchor point. */
  188.  
  189.                         Index    = i;
  190.                         Top        = i + 1;
  191.  
  192.                         FoundIt = TRUE;
  193.  
  194.                         break;
  195.                     }
  196.                 }
  197.                 else
  198.                 {
  199.                     DB(kprintf("no name given\n"));
  200.  
  201.                         /* Is the name really a number? */
  202.  
  203.                     if(NodeIsNumeric)
  204.                     {
  205.                             /* Store the counter. */
  206.  
  207.                         if(*Count1 == -1)
  208.                             *Count1 = Atol(NodeName);
  209.                         else
  210.                             *Count2 = Atol(NodeName);
  211.  
  212.                         DB(kprintf("using the entry; count1=%ld count2=%ld\n",*Count1,*Count2));
  213.  
  214.                             /* Remember new anchor point. */
  215.  
  216.                         Index    = i;
  217.                         Top    = i + 1;
  218.  
  219.                         FoundIt = TRUE;
  220.  
  221.                         break;
  222.                     }
  223.                 }
  224.             }
  225.             else
  226.             {
  227.                     /* Don't move back up in the tree! */
  228.  
  229.                 if(AttributeTable[i].Level < Level)
  230.                     break;
  231.             }
  232.         }
  233.  
  234.         if(FoundIt)
  235.             Level++;
  236.         else
  237.             break;
  238.     }
  239.  
  240.         /* In case the last entry was found, return the index. */
  241.  
  242.     if(FoundIt)
  243.         return(Index);
  244.     else
  245.         return(-1);
  246. }
  247.  
  248.     /* FromIndex(LONG Index,LONG Count1,LONG Count2):
  249.      *
  250.      *    Turn an index/count key into a neat index name.
  251.      */
  252.  
  253. STATIC STRPTR
  254. FromIndex(LONG Index,LONG Count1,LONG Count2,BOOL IncludeRoot)
  255. {
  256.     STATIC UBYTE NameBuffer[160];
  257.  
  258.     LONG Levels[4],i;
  259.  
  260.         /* Reset the level indices. */
  261.  
  262.     for(i = 1 ; i < 4 ; i++)
  263.         Levels[i] = -1;
  264.  
  265.         /* Fill in the leaf level. */
  266.  
  267.     Levels[0] = Index;
  268.  
  269.         /* Top node? */
  270.  
  271.     if(Index > 0)
  272.     {
  273.         LONG Count = 1,Level = AttributeTable[Index].Level;
  274.  
  275.             /* Move up in the tree. */
  276.  
  277.         for(i = Index - 1 ; i >= 0 ; i--)
  278.         {
  279.                 /* Previous level? */
  280.  
  281.             if(AttributeTable[i].Level == Level - 1)
  282.             {
  283.                     /* Store index. */
  284.  
  285.                 Levels[Count++] = i;
  286.  
  287.                 Level--;
  288.             }
  289.         }
  290.     }
  291.  
  292.         /* Clear name buffer. */
  293.  
  294.     NameBuffer[0] = 0;
  295.  
  296.         /* Scan backwards. */
  297.  
  298.     for(i = 3 ; i >= 0 ; i--)
  299.     {
  300.             /* Valid level index? */
  301.  
  302.         if(Levels[i] != -1)
  303.         {
  304.                 /* First name? */
  305.  
  306.             if(!NameBuffer[0])
  307.                 strcpy(NameBuffer,AttributeTable[Levels[i]].Name);
  308.             else
  309.             {
  310.                     /* Valid name string? */
  311.  
  312.                 if(AttributeTable[Levels[i]].Name)
  313.                 {
  314.                     LimitedStrcat(sizeof(NameBuffer),NameBuffer,".");
  315.                     LimitedStrcat(sizeof(NameBuffer),NameBuffer,AttributeTable[Levels[i]].Name);
  316.                 }
  317.                 else
  318.                 {
  319.                     UBYTE Number[20];
  320.  
  321.                         /* Add an index number. */
  322.  
  323.                     if(Count1 != -1)
  324.                     {
  325.                         LimitedSPrintf(sizeof(Number),Number,".%ld",Count1);
  326.  
  327.                         Count1 = -1;
  328.                     }
  329.                     else
  330.                         LimitedSPrintf(sizeof(Number),Number,".%ld",Count2);
  331.  
  332.                     LimitedStrcat(sizeof(NameBuffer),NameBuffer,Number);
  333.                 }
  334.             }
  335.         }
  336.     }
  337.  
  338.         /* Return the name string. */
  339.  
  340.     if(IncludeRoot)
  341.         return(NameBuffer);
  342.     else
  343.     {
  344.         STRPTR Name = NameBuffer;
  345.  
  346.         while(*Name++ != '.');
  347.  
  348.         return(Name);
  349.     }
  350. }
  351.  
  352.     /* GetSingleAttribute(LONG ID,LONG Index,LONG Count1,STRPTR Input):
  353.      *
  354.      *    Beware the MONSTER!
  355.      */
  356.  
  357. STATIC LONG
  358. GetSingleAttribute(LONG ID,LONG Index,LONG Count1,STRPTR *Result)
  359. {
  360.     STATIC UBYTE ResultBuffer[MAXPUBSCREENNAME + 1];
  361.  
  362.     LONG Number,Error;
  363.     STRPTR String;
  364.  
  365.     Error    = 0;
  366.     String    = NULL;
  367.     Number    = 0;
  368.  
  369.     switch(ID)
  370.     {
  371.         case ATTR_APPLICATION_VERSION:
  372.  
  373.             LimitedSPrintf(sizeof(ResultBuffer),ResultBuffer,"%ld.%ld",TermVersion,TermRevision);
  374.  
  375.             String = ResultBuffer;
  376.  
  377.             break;
  378.  
  379.         case ATTR_APPLICATION_SCREEN:
  380.  
  381.             if(GetPubScreenName(Window->WScreen,ResultBuffer))
  382.                 String = ResultBuffer;
  383.             else
  384.                 Error = ERROR_OBJECT_NOT_FOUND;
  385.  
  386.             break;
  387.  
  388.         case ATTR_APPLICATION_SESSION_ONLINE:
  389.  
  390.             Number = Online;
  391.             break;
  392.  
  393.         case ATTR_APPLICATION_SESSION_SESSIONSTART:
  394.  
  395.             if(!FormatStamp(&SessionStart,ResultBuffer,sizeof(ResultBuffer),FALSE))
  396.                 strcpy(ResultBuffer,"-");
  397.  
  398.             String = ResultBuffer;
  399.  
  400.             break;
  401.  
  402.         case ATTR_APPLICATION_SESSION_BYTESSENT:
  403.  
  404.             Number = BytesOut;
  405.             break;
  406.  
  407.         case ATTR_APPLICATION_SESSION_BYTESRECEIVED:
  408.  
  409.             Number = BytesIn;
  410.             break;
  411.  
  412.         case ATTR_APPLICATION_SESSION_CONNECTMESSAGE:
  413.  
  414.             String = BaudBuffer;
  415.             break;
  416.  
  417.         case ATTR_APPLICATION_SESSION_BBSNAME:
  418.  
  419.             String = CurrentBBSName;
  420.             break;
  421.  
  422.         case ATTR_APPLICATION_SESSION_BBSNUMBER:
  423.  
  424.             String = CurrentBBSNumber;
  425.             break;
  426.  
  427.         case ATTR_APPLICATION_SESSION_BBSCOMMENT:
  428.  
  429.             String = CurrentBBSComment;
  430.             break;
  431.  
  432.         case ATTR_APPLICATION_SESSION_USERNAME:
  433.  
  434.             String = UserName;
  435.             break;
  436.  
  437.         case ATTR_APPLICATION_SESSION_ONLINEMINUTES:
  438.  
  439.             Number = OnlineMinutes;
  440.             break;
  441.  
  442.         case ATTR_APPLICATION_SESSION_ONLINECOST:
  443.  
  444.             Number = (QueryAccountantCost() + 5000) / 10000;
  445.             break;
  446.  
  447.         case ATTR_APPLICATION_AREXX:
  448.  
  449.             String = RexxPortName;
  450.             break;
  451.  
  452.         case ATTR_APPLICATION_LASTERROR:
  453.  
  454.             Number = LastRexxError;
  455.             break;
  456.  
  457.         case ATTR_APPLICATION_TERMINAL_ROWS:
  458.  
  459.             if(XEmulatorBase && XEM_IO)
  460.             {
  461.                 if(XEmulatorBase->lib_Version >= 4)
  462.                 {
  463.                     ULONG LocalResult;
  464.  
  465.                     LocalResult = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  466.  
  467.                     Number = XEMI_EXTRACT_LINES(LocalResult);
  468.                 }
  469.                 else
  470.                     Number = 0;
  471.             }
  472.             else
  473.                 Number = LastLine + 1;
  474.  
  475.             break;
  476.  
  477.         case ATTR_APPLICATION_TERMINAL_COLUMNS:
  478.  
  479.             if(XEmulatorBase && XEM_IO)
  480.             {
  481.                 if(XEmulatorBase->lib_Version >= 4)
  482.                 {
  483.                     ULONG LocalResult;
  484.  
  485.                     LocalResult = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  486.  
  487.                     Number = XEMI_EXTRACT_COLUMNS(LocalResult);
  488.                 }
  489.                 else
  490.                     Number = 0;
  491.             }
  492.             else
  493.                 Number = LastColumn + 1;
  494.  
  495.             break;
  496.  
  497.         case ATTR_APPLICATION_BUFFER_SIZE:
  498.  
  499.             Number = BufferSpace;
  500.             break;
  501.  
  502.         case ATTR_PREFS_SERIAL_BAUDRATE:
  503.  
  504.             Number = Config->SerialConfig->BaudRate;
  505.             break;
  506.  
  507.         case ATTR_PREFS_SERIAL_USE_OWNDEVUNIT:
  508.  
  509.             Number = Config->SerialConfig->UseOwnDevUnit;
  510.             break;
  511.  
  512.         case ATTR_PREFS_SERIAL_DIRECT_CONNECTION:
  513.  
  514.             Number = Config->SerialConfig->DirectConnection;
  515.             break;
  516.  
  517.         case ATTR_PREFS_SERIAL_BREAKLENGTH:
  518.  
  519.             Number = Config->SerialConfig->BreakLength;
  520.             break;
  521.  
  522.         case ATTR_PREFS_SERIAL_BUFFERSIZE:
  523.  
  524.             Number = Config->SerialConfig->SerialBufferSize;
  525.             break;
  526.  
  527.         case ATTR_PREFS_SERIAL_QUANTUM:
  528.  
  529.             Number = Config->SerialConfig->Quantum;
  530.             break;
  531.  
  532.         case ATTR_PREFS_SERIAL_DEVICENAME:
  533.  
  534.             String = Config->SerialConfig->SerialDevice;
  535.             break;
  536.  
  537.         case ATTR_PREFS_SERIAL_UNIT:
  538.  
  539.             Number = Config->SerialConfig->UnitNumber;
  540.             break;
  541.  
  542.         case ATTR_PREFS_SERIAL_BITSPERCHAR:
  543.  
  544.             Number = Config->SerialConfig->BitsPerChar;
  545.             break;
  546.  
  547.         case ATTR_PREFS_SERIAL_PARITYMODE:
  548.  
  549.             Number = Config->SerialConfig->Parity;
  550.             break;
  551.  
  552.         case ATTR_PREFS_SERIAL_STOPBITS:
  553.  
  554.             Number = Config->SerialConfig->StopBits;
  555.             break;
  556.  
  557.         case ATTR_PREFS_SERIAL_HANDSHAKINGMODE:
  558.  
  559.             Number = Config->SerialConfig->HandshakingProtocol;
  560.             break;
  561.  
  562.         case ATTR_PREFS_SERIAL_DUPLEXMODE:
  563.  
  564.             Number = Config->SerialConfig->Duplex;
  565.             break;
  566.  
  567.         case ATTR_PREFS_SERIAL_XONXOFF:
  568.  
  569.             Number = Config->SerialConfig->xONxOFF;
  570.             break;
  571.  
  572.         case ATTR_PREFS_SERIAL_HIGHSPEED:
  573.  
  574.             Number = Config->SerialConfig->HighSpeed;
  575.             break;
  576.  
  577.         case ATTR_PREFS_SERIAL_SHARED:
  578.  
  579.             Number = Config->SerialConfig->Shared;
  580.             break;
  581.  
  582.         case ATTR_PREFS_SERIAL_STRIPBIT8:
  583.  
  584.             Number = Config->SerialConfig->StripBit8;
  585.             break;
  586.  
  587.         case ATTR_PREFS_SERIAL_CARRIERCHECK:
  588.  
  589.             Number = Config->SerialConfig->CheckCarrier;
  590.             break;
  591.  
  592.         case ATTR_PREFS_SERIAL_PASSXONXOFFTHROUGH:
  593.  
  594.             Number = Config->SerialConfig->PassThrough;
  595.             break;
  596.  
  597.         case ATTR_PREFS_SERIAL_OWNDEVUNIT_REQUEST:
  598.  
  599.             Number = Config->SerialConfig->SatisfyODURequests;
  600.             break;
  601.  
  602.         case ATTR_PREFS_MODEM_DIAL_MODE:
  603.  
  604.             Number = Config->ModemConfig->DialMode;
  605.             break;
  606.  
  607.         case ATTR_PREFS_MODEM_PBX_MODE:
  608.  
  609.             Number = Config->ModemConfig->PBX_Mode;
  610.             break;
  611.  
  612.         case ATTR_PREFS_MODEM_DO_NOT_SEND_COMMANDS:
  613.  
  614.             Number = Config->ModemConfig->DoNotSendMainModemCommands;
  615.             break;
  616.  
  617.         case ATTR_PREFS_MODEM_CHAR_SEND_DELAY:
  618.  
  619.             Number = Config->ModemConfig->CharSendDelay;
  620.             break;
  621.  
  622.         case ATTR_PREFS_MODEM_MODEMINITTEXT:
  623.  
  624.             String = Config->ModemConfig->ModemInit;
  625.             break;
  626.  
  627.         case ATTR_PREFS_MODEM_PBX_PREFIX:
  628.  
  629.             String = Config->ModemConfig->PBX_Prefix;
  630.             break;
  631.  
  632.         case ATTR_PREFS_MODEM_MODEMEXITTEXT:
  633.  
  634.             String = Config->ModemConfig->ModemExit;
  635.             break;
  636.  
  637.         case ATTR_PREFS_MODEM_MODEMHANGUPTEXT:
  638.  
  639.             String = Config->ModemConfig->ModemHangup;
  640.             break;
  641.  
  642.         case ATTR_PREFS_MODEM_DIALPREFIXTEXT:
  643.  
  644.             String = Config->ModemConfig->DialPrefix;
  645.             break;
  646.  
  647.         case ATTR_PREFS_MODEM_DIALSUFFIXTEXT:
  648.  
  649.             String = Config->ModemConfig->DialSuffix;
  650.             break;
  651.  
  652.         case ATTR_PREFS_MODEM_NOCARRIERTEXT:
  653.  
  654.             String = Config->ModemConfig->NoCarrier;
  655.             break;
  656.  
  657.         case ATTR_PREFS_MODEM_NODIALTONETEXT:
  658.  
  659.             String = Config->ModemConfig->NoDialTone;
  660.             break;
  661.  
  662.         case ATTR_PREFS_MODEM_CONNECTTEXT:
  663.  
  664.             String = Config->ModemConfig->Connect;
  665.             break;
  666.  
  667.         case ATTR_PREFS_MODEM_VOICETEXT:
  668.  
  669.             String = Config->ModemConfig->Voice;
  670.             break;
  671.  
  672.         case ATTR_PREFS_MODEM_RINGTEXT:
  673.  
  674.             String = Config->ModemConfig->Ring;
  675.             break;
  676.  
  677.         case ATTR_PREFS_MODEM_BUSYTEXT:
  678.  
  679.             String = Config->ModemConfig->Busy;
  680.             break;
  681.  
  682.         case ATTR_PREFS_MODEM_OKTEXT:
  683.  
  684.             String = Config->ModemConfig->Ok;
  685.             break;
  686.  
  687.         case ATTR_PREFS_MODEM_ERRORTEXT:
  688.  
  689.             String = Config->ModemConfig->Error;
  690.             break;
  691.  
  692.         case ATTR_PREFS_MODEM_REDIALDELAY:
  693.  
  694.             Number = Config->ModemConfig->RedialDelay;
  695.             break;
  696.  
  697.         case ATTR_PREFS_MODEM_DIALRETRIES:
  698.  
  699.             Number = Config->ModemConfig->DialRetries;
  700.             break;
  701.  
  702.         case ATTR_PREFS_MODEM_DIALTIMEOUT:
  703.  
  704.             Number = Config->ModemConfig->DialTimeout;
  705.             break;
  706.  
  707.         case ATTR_PREFS_MODEM_INTER_DIAL_DELAY:
  708.  
  709.             Number = Config->ModemConfig->InterDialDelay;
  710.             break;
  711.  
  712.         case ATTR_PREFS_MODEM_CONNECTAUTOBAUD:
  713.  
  714.             Number = Config->ModemConfig->ConnectAutoBaud;
  715.             break;
  716.  
  717.         case ATTR_PREFS_MODEM_HANGUPDROPSDTR:
  718.  
  719.             Number = Config->ModemConfig->DropDTR;
  720.             break;
  721.  
  722.         case ATTR_PREFS_MODEM_REDIALAFTERHANGUP:
  723.  
  724.             Number = Config->ModemConfig->RedialAfterHangup;
  725.             break;
  726.  
  727.         case ATTR_PREFS_MODEM_VERBOSEDIALING:
  728.  
  729.             Number = Config->ModemConfig->VerboseDialing;
  730.             break;
  731.  
  732.         case ATTR_PREFS_MODEM_NOCARRIERISBUSY:
  733.  
  734.             Number = Config->ModemConfig->NoCarrierIsBusy;
  735.             break;
  736.  
  737.         case ATTR_PREFS_MODEM_CONNECTLIMIT:
  738.  
  739.             Number = Config->ModemConfig->ConnectLimit;
  740.             break;
  741.  
  742.         case ATTR_PREFS_MODEM_CONNECTLIMITMACRO:
  743.  
  744.             String = Config->ModemConfig->ConnectLimitMacro;
  745.             break;
  746.  
  747.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_ONLINE:
  748.  
  749.             Number = Config->SerialConfig->ReleaseODUWhenOnline;
  750.             break;
  751.  
  752.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_DIALING:
  753.  
  754.             Number = Config->SerialConfig->ReleaseODUWhenDialing;
  755.             break;
  756.  
  757.         case ATTR_PREFS_SERIAL_NO_ODU_IF_SHARED:
  758.  
  759.             Number = Config->SerialConfig->NoODUIfShared;
  760.             break;
  761.  
  762.         case ATTR_PREFS_SERIAL_LOCAL_ECHO:
  763.  
  764.             Number = Config->SerialConfig->Duplex;
  765.             break;
  766.  
  767.         case ATTR_PREFS_MODEM_TIME_TO_CONNECT:
  768.  
  769.             Number = Config->ModemConfig->TimeToConnect;
  770.             break;
  771.  
  772.         case ATTR_PREFS_COMMANDS_STARTUPMACROTEXT:
  773.  
  774.             String = Config->CommandConfig->StartupMacro;
  775.             break;
  776.  
  777.         case ATTR_PREFS_COMMANDS_LOGINMACROTEXT:
  778.  
  779.             String = Config->CommandConfig->LoginMacro;
  780.             break;
  781.  
  782.         case ATTR_PREFS_COMMANDS_LOGOFFMACROTEXT:
  783.  
  784.             String = Config->CommandConfig->LogoffMacro;
  785.             break;
  786.  
  787.         case ATTR_PREFS_COMMANDS_UPLOADMACROTEXT:
  788.  
  789.             String = Config->CommandConfig->UploadMacro;
  790.             break;
  791.  
  792.         case ATTR_PREFS_COMMANDS_DOWNLOADMACROTEXT:
  793.  
  794.             String = Config->CommandConfig->DownloadMacro;
  795.             break;
  796.  
  797.         case ATTR_PREFS_SCREEN_COLOURMODE:
  798.  
  799.             Number = Config->ScreenConfig->ColourMode;
  800.             break;
  801.  
  802.         case ATTR_PREFS_SCREEN_USEPENS:
  803.  
  804.             Number = Config->ScreenConfig->UsePens;
  805.             break;
  806.  
  807.         case ATTR_PREFS_SCREEN_WINDOW_BORDER:
  808.  
  809.             Number = Config->ScreenConfig->ShareScreen;
  810.             break;
  811.  
  812.         case ATTR_PREFS_SCREEN_SPLIT_STATUS:
  813.  
  814.             Number = Config->ScreenConfig->SplitStatus;
  815.             break;
  816.  
  817.         case ATTR_PREFS_SCREEN_FONTNAME:
  818.  
  819.             String = Config->ScreenConfig->FontName;
  820.             break;
  821.  
  822.         case ATTR_PREFS_SCREEN_FONTSIZE:
  823.  
  824.             Number = Config->ScreenConfig->FontHeight;
  825.             break;
  826.  
  827.         case ATTR_PREFS_SCREEN_MAKESCREENPUBLIC:
  828.  
  829.             Number = Config->ScreenConfig->MakeScreenPublic;
  830.             break;
  831.  
  832.         case ATTR_PREFS_SCREEN_SHANGHAIWINDOWS:
  833.  
  834.             break;
  835.  
  836.         case ATTR_PREFS_SCREEN_BLINKING:
  837.  
  838.             Number = Config->ScreenConfig->Blinking;
  839.             break;
  840.  
  841.         case ATTR_PREFS_SCREEN_FASTERLAYOUT:
  842.  
  843.             Number = Config->ScreenConfig->FasterLayout;
  844.             break;
  845.  
  846.         case ATTR_PREFS_SCREEN_TITLEBAR:
  847.  
  848.             Number = Config->ScreenConfig->TitleBar;
  849.             break;
  850.  
  851.         case ATTR_PREFS_SCREEN_STATUSLINEMODE:
  852.  
  853.             Number = Config->ScreenConfig->StatusLine;
  854.             break;
  855.  
  856.         case ATTR_PREFS_SCREEN_USEWORKBENCH:
  857.  
  858.             Number = Config->ScreenConfig->UseWorkbench;
  859.             break;
  860.  
  861.         case ATTR_PREFS_SCREEN_PUBSCREENNAME:
  862.  
  863.             String = Config->ScreenConfig->PubScreenName;
  864.             break;
  865.  
  866.         case ATTR_PREFS_SCREEN_ONLINEDISPLAY:
  867.  
  868.             Number = Config->ScreenConfig->TimeMode;
  869.             break;
  870.  
  871.         case ATTR_PREFS_TERMINAL_BELLMODE:
  872.  
  873.             Number = Config->TerminalConfig->BellMode;
  874.             break;
  875.  
  876.         case ATTR_PREFS_TERMINAL_USETERMINALPROCESS:
  877.  
  878.             Number = Config->TerminalConfig->UseTerminalTask;
  879.             break;
  880.  
  881.         case ATTR_PREFS_TERMINAL_AUTOSIZE:
  882.  
  883.             Number = Config->TerminalConfig->AutoSize;
  884.             break;
  885.  
  886.         case ATTR_PREFS_TERMINAL_EMULATIONMODE:
  887.  
  888.             Number = Config->TerminalConfig->EmulationMode;
  889.             break;
  890.  
  891.         case ATTR_PREFS_TERMINAL_FONTMODE:
  892.  
  893.             Number = Config->TerminalConfig->FontMode;
  894.             break;
  895.  
  896.         case ATTR_PREFS_TERMINAL_SENDCRMODE:
  897.  
  898.             Number = Config->TerminalConfig->SendCR;
  899.             break;
  900.  
  901.         case ATTR_PREFS_TERMINAL_SENDLFMODE:
  902.  
  903.             Number = Config->TerminalConfig->SendLF;
  904.             break;
  905.  
  906.         case ATTR_PREFS_TERMINAL_RECEIVECRMODE:
  907.  
  908.             Number = Config->TerminalConfig->ReceiveCR;
  909.             break;
  910.  
  911.         case ATTR_PREFS_TERMINAL_RECEIVELFMODE:
  912.  
  913.             Number = Config->TerminalConfig->ReceiveLF;
  914.             break;
  915.  
  916.         case ATTR_PREFS_TERMINAL_NUMCOLUMNS:
  917.  
  918.             Number = Config->TerminalConfig->NumColumns;
  919.             break;
  920.  
  921.         case ATTR_PREFS_TERMINAL_NUMLINES:
  922.  
  923.             Number = Config->TerminalConfig->NumLines;
  924.             break;
  925.  
  926.         case ATTR_PREFS_TERMINAL_KEYMAPNAME:
  927.  
  928.             String = Config->TerminalConfig->KeyMapFileName;
  929.             break;
  930.  
  931.         case ATTR_PREFS_TERMINAL_EMULATIONNAME:
  932.  
  933.             String = Config->TerminalConfig->EmulationFileName;
  934.             break;
  935.  
  936.         case ATTR_PREFS_TERMINAL_FONTNAME:
  937.  
  938.             String = Config->TerminalConfig->TextFontName;
  939.             break;
  940.  
  941.         case ATTR_PREFS_TERMINAL_FONTSIZE:
  942.  
  943.             Number = Config->TerminalConfig->TextFontHeight;
  944.             break;
  945.  
  946.         case ATTR_PREFS_PATHS_ASCIIUPLOADPATH:
  947.  
  948.             String = Config->PathConfig->ASCIIUploadPath;
  949.             break;
  950.  
  951.         case ATTR_PREFS_PATHS_ASCIIDOWNLOADPATH:
  952.  
  953.             String = Config->PathConfig->ASCIIDownloadPath;
  954.             break;
  955.  
  956.         case ATTR_PREFS_PATHS_TEXTUPLOADPATH:
  957.  
  958.             String = Config->PathConfig->TextUploadPath;
  959.             break;
  960.  
  961.         case ATTR_PREFS_PATHS_TEXTDOWNLOADPATH:
  962.  
  963.             String = Config->PathConfig->TextDownloadPath;
  964.             break;
  965.  
  966.         case ATTR_PREFS_PATHS_BINARYUPLOADPATH:
  967.  
  968.             String = Config->PathConfig->BinaryUploadPath;
  969.             break;
  970.  
  971.         case ATTR_PREFS_PATHS_BINARYDOWNLOADPATH:
  972.  
  973.             String = Config->PathConfig->BinaryDownloadPath;
  974.             break;
  975.  
  976.         case ATTR_PREFS_PATHS_CONFIGPATH:
  977.  
  978.             String = Config->PathConfig->DefaultStorage;
  979.             break;
  980.  
  981.         case ATTR_PREFS_PATHS_EDITORNAME:
  982.  
  983.             String = Config->PathConfig->Editor;
  984.             break;
  985.  
  986.         case ATTR_PREFS_PATHS_HELPFILENAME:
  987.  
  988.             String = Config->PathConfig->HelpFile;
  989.             break;
  990.  
  991.         case ATTR_PREFS_MISC_ALERTMODE:
  992.  
  993.             Number = Config->MiscConfig->AlertMode;
  994.             break;
  995.  
  996.         case ATTR_PREFS_MISC_WAITSTRING:
  997.  
  998.             String = Config->MiscConfig->WaitString;
  999.             break;
  1000.  
  1001.         case ATTR_PREFS_MISC_WAITDELAY:
  1002.  
  1003.             Number = Config->MiscConfig->WaitDelay;
  1004.             break;
  1005.  
  1006.         case ATTR_PREFS_MISC_REQUESTERMODE:
  1007.  
  1008.             Number = Config->MiscConfig->RequesterMode;
  1009.             break;
  1010.  
  1011.         case ATTR_PREFS_MISC_REQUESTERWIDTH:
  1012.  
  1013.             Number = Config->MiscConfig->RequesterWidth;
  1014.             break;
  1015.  
  1016.         case ATTR_PREFS_MISC_REQUESTERHEIGHT:
  1017.  
  1018.             Number = Config->MiscConfig->RequesterHeight;
  1019.             break;
  1020.  
  1021.         case ATTR_PREFS_MISC_IOBUFFERSIZE:
  1022.  
  1023.             Number = Config->MiscConfig->IOBufferSize;
  1024.             break;
  1025.  
  1026.         case ATTR_PREFS_MISC_PRIORITY:
  1027.  
  1028.             Number = Config->MiscConfig->Priority;
  1029.             break;
  1030.  
  1031.         case ATTR_PREFS_MISC_BACKUPCONFIG:
  1032.  
  1033.             Number = Config->MiscConfig->BackupConfig;
  1034.             break;
  1035.  
  1036.         case ATTR_PREFS_MISC_OVERWRITE_WARNING:
  1037.  
  1038.             Number = Config->MiscConfig->ProtectiveMode;
  1039.             break;
  1040.  
  1041.         case ATTR_PREFS_MISC_SUPPRESSOUTPUT:
  1042.  
  1043.             Number = Config->MiscConfig->SuppressOutput;
  1044.             break;
  1045.  
  1046.         case ATTR_PREFS_MISC_OPENFASTMACROPANEL:
  1047.  
  1048.             Number = Config->MiscConfig->OpenFastMacroPanel;
  1049.             break;
  1050.  
  1051.         case ATTR_PREFS_MISC_RELEASEDEVICE:
  1052.  
  1053.             Number = Config->MiscConfig->ReleaseDevice;
  1054.             break;
  1055.  
  1056.         case ATTR_PREFS_MISC_OVERRIDEPATH:
  1057.         case ATTR_PREFS_TRANSFER_OVERRIDEPATH:
  1058.  
  1059.             Number = Config->TransferConfig->OverridePath;
  1060.             break;
  1061.  
  1062.         case ATTR_PREFS_TRANSFER_EXPAND_BLANK_LINES:
  1063.  
  1064.             Number = Config->TransferConfig->ExpandBlankLines;
  1065.             break;
  1066.  
  1067.         case ATTR_PREFS_MISC_AUTOUPLOAD:
  1068.  
  1069.             Number = Config->MiscConfig->AutoUpload;
  1070.             break;
  1071.  
  1072.         case ATTR_PREFS_MISC_SETARCHIVEDBIT:
  1073.         case ATTR_PREFS_TRANSFER_SETARCHIVEDBIT:
  1074.  
  1075.             Number = Config->TransferConfig->SetArchivedBit;
  1076.             break;
  1077.  
  1078.         case ATTR_PREFS_TRANSFER_COMMENTMODE:
  1079.         case ATTR_PREFS_MISC_COMMENTMODE:
  1080.  
  1081.             Number = Config->TransferConfig->IdentifyFiles;
  1082.             break;
  1083.  
  1084.         case ATTR_PREFS_MISC_TRANSFERICONS:
  1085.         case ATTR_PREFS_TRANSFER_TRANSFERICONS:
  1086.  
  1087.             Number = Config->TransferConfig->TransferIcons;
  1088.             break;
  1089.  
  1090.         case ATTR_PREFS_MISC_CREATEICONS:
  1091.  
  1092.             Number = Config->MiscConfig->CreateIcons;
  1093.             break;
  1094.  
  1095.         case ATTR_PREFS_MISC_SIMPLEIO:
  1096.  
  1097.             Number = Config->MiscConfig->SimpleIO;
  1098.             break;
  1099.  
  1100.         case ATTR_PREFS_MISC_HIDE_UPLOAD_ICON:
  1101.         case ATTR_PREFS_TRANSFER_HIDE_UPLOAD_ICON:
  1102.  
  1103.             Number = Config->TransferConfig->HideUploadIcon;
  1104.             break;
  1105.  
  1106.         case ATTR_PREFS_MISC_TRANSFER_PERFMETER:
  1107.         case ATTR_PREFS_TRANSFER_TRANSFER_PERFMETER:
  1108.  
  1109.             Number = Config->TransferConfig->PerfMeter;
  1110.             break;
  1111.  
  1112.         case ATTR_PREFS_CLIPBOARD_UNIT:
  1113.  
  1114.             Number = Config->ClipConfig->ClipboardUnit;
  1115.             break;
  1116.  
  1117.         case ATTR_PREFS_CLIPBOARD_LINEDELAY:
  1118.  
  1119.             Number = Config->ClipConfig->LineDelay;
  1120.             break;
  1121.  
  1122.         case ATTR_PREFS_CLIPBOARD_CHARDELAY:
  1123.  
  1124.             Number = Config->ClipConfig->CharDelay;
  1125.             break;
  1126.  
  1127.         case ATTR_PREFS_CLIPBOARD_INSERTPREFIXTEXT:
  1128.  
  1129.             String = Config->ClipConfig->InsertPrefix;
  1130.             break;
  1131.  
  1132.         case ATTR_PREFS_CLIPBOARD_INSERTSUFFIXTEXT:
  1133.  
  1134.             String = Config->ClipConfig->InsertSuffix;
  1135.             break;
  1136.  
  1137.         case ATTR_PREFS_CLIPBOARD_LINEPROMPT:
  1138.  
  1139.             String = Config->ClipConfig->LinePrompt;
  1140.             break;
  1141.  
  1142.         case ATTR_PREFS_CLIPBOARD_TEXTPACING:
  1143.  
  1144.             Number = Config->ClipConfig->PacingMode;
  1145.             break;
  1146.  
  1147.         case ATTR_PREFS_CLIPBOARD_SENDTIMEOUT:
  1148.  
  1149.             Number = Config->ClipConfig->SendTimeout;
  1150.             break;
  1151.  
  1152.         case ATTR_PREFS_CLIPBOARD_CONVERTLF:
  1153.  
  1154.             Number = Config->ClipConfig->ConvertLF;
  1155.             break;
  1156.  
  1157.         case ATTR_PREFS_CAPTURE_CONVERTCHARACTERS:
  1158.  
  1159.             Number = Config->CaptureConfig->ConvertChars;
  1160.             break;
  1161.  
  1162.         case ATTR_PREFS_CAPTURE_BUFFERMODE:
  1163.  
  1164.             Number = Config->CaptureConfig->BufferMode;
  1165.             break;
  1166.  
  1167.         case ATTR_PREFS_CAPTURE_BUFFERSAFETYMEMORY:
  1168.  
  1169.             Number = Config->CaptureConfig->BufferSafetyMemory;
  1170.             break;
  1171.  
  1172.         case ATTR_PREFS_CAPTURE_LOGACTIONS:
  1173.  
  1174.             Number = Config->CaptureConfig->LogActions;
  1175.             break;
  1176.  
  1177.         case ATTR_PREFS_CAPTURE_LOGCALLS:
  1178.  
  1179.             Number = Config->CaptureConfig->LogCall;
  1180.             break;
  1181.  
  1182.         case ATTR_PREFS_CAPTURE_LOGFILENAME:
  1183.  
  1184.             String = Config->CaptureConfig->LogFileName;
  1185.             break;
  1186.  
  1187.         case ATTR_PREFS_CAPTURE_MAXBUFFERSIZE:
  1188.  
  1189.             Number = Config->CaptureConfig->MaxBufferSize;
  1190.             break;
  1191.  
  1192.         case ATTR_PREFS_CAPTURE_BUFFER:
  1193.  
  1194.             Number = Config->CaptureConfig->BufferEnabled;
  1195.             break;
  1196.  
  1197.         case ATTR_PREFS_CAPTURE_CONNECTAUTOCAPTURE:
  1198.  
  1199.             Number = Config->CaptureConfig->ConnectAutoCapture;
  1200.             break;
  1201.  
  1202.         case ATTR_PREFS_CAPTURE_AUTOCAPTUREDATE:
  1203.  
  1204.             Number = Config->CaptureConfig->AutoCaptureDate;
  1205.             break;
  1206.  
  1207.         case ATTR_PREFS_CAPTURE_CAPTUREFILTER:
  1208.  
  1209.             Number = Config->CaptureConfig->CaptureFilterMode;
  1210.             break;
  1211.  
  1212.         case ATTR_PREFS_CAPTURE_CAPTUREPATH:
  1213.  
  1214.             String = Config->CaptureConfig->CapturePath;
  1215.             break;
  1216.  
  1217.         case ATTR_PREFS_CAPTURE_CALLLOGFILENAME:
  1218.  
  1219.             String = Config->CaptureConfig->CallLogFileName;
  1220.             break;
  1221.  
  1222.         case ATTR_PREFS_CAPTURE_BUFFERSAVEPATH:
  1223.  
  1224.             String = Config->CaptureConfig->BufferPath;
  1225.             break;
  1226.  
  1227.         case ATTR_PREFS_CAPTURE_OPENBUFFERWINDOW:
  1228.  
  1229.             Number = Config->CaptureConfig->OpenBufferWindow;
  1230.             break;
  1231.  
  1232.         case ATTR_PREFS_CAPTURE_OPENBUFFERSCREEN:
  1233.  
  1234.             Number = Config->CaptureConfig->OpenBufferScreen;
  1235.             break;
  1236.  
  1237.         case ATTR_PREFS_CAPTURE_BUFFERSCREENPOSITION:
  1238.  
  1239.             Number = Config->CaptureConfig->BufferScreenPosition;
  1240.             break;
  1241.  
  1242.         case ATTR_PREFS_CAPTURE_BUFFERWIDTH:
  1243.  
  1244.             Number = Config->CaptureConfig->BufferWidth;
  1245.             break;
  1246.  
  1247.         case ATTR_PREFS_CAPTURE_SEARCH_HISTORY:
  1248.  
  1249.             Number = Config->CaptureConfig->SearchHistory;
  1250.             break;
  1251.  
  1252.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERWINDOW:
  1253.  
  1254.             Number = Config->CaptureConfig->RememberBufferWindow;
  1255.             break;
  1256.  
  1257.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERSCREEN:
  1258.  
  1259.             Number = Config->CaptureConfig->RememberBufferScreen;
  1260.             break;
  1261.  
  1262.         case ATTR_PREFS_FILE_TRANSFERPROTOCOLNAME:
  1263.  
  1264.             String = Config->TransferConfig->DefaultLibrary;
  1265.             break;
  1266.  
  1267.         case ATTR_PREFS_FILE_TRANSLATIONFILENAME:
  1268.  
  1269.             String = Config->TranslationFileName;
  1270.             break;
  1271.  
  1272.         case ATTR_PREFS_FILE_MACROFILENAME:
  1273.  
  1274.             String = Config->MacroFileName;
  1275.             break;
  1276.  
  1277.         case ATTR_PREFS_FILE_CURSORFILENAME:
  1278.  
  1279.             String = Config->CursorFileName;
  1280.             break;
  1281.  
  1282.         case ATTR_PREFS_FILE_FASTMACROFILENAME:
  1283.  
  1284.             String = Config->FastMacroFileName;
  1285.             break;
  1286.  
  1287.         case ATTR_PREFS_EMULATION_IDENTIFICATION:
  1288.  
  1289.             Number = Config->EmulationConfig->TerminalType;
  1290.             break;
  1291.  
  1292.         case ATTR_PREFS_EMULATION_STYLELOCKED:
  1293.  
  1294.             Number = Config->EmulationConfig->LockStyle;
  1295.             break;
  1296.  
  1297.         case ATTR_PREFS_EMULATION_USEPENS:
  1298.  
  1299.             Number = Config->EmulationConfig->UseStandardPens;
  1300.             break;
  1301.  
  1302.         case ATTR_PREFS_EMULATION_COLOURLOCKED:
  1303.  
  1304.             Number = Config->EmulationConfig->LockColour;
  1305.             break;
  1306.  
  1307.         case ATTR_PREFS_EMULATION_CURSORMODE:
  1308.  
  1309.             Number = Config->EmulationConfig->CursorMode;
  1310.             break;
  1311.  
  1312.         case ATTR_PREFS_EMULATION_CURSORLOCKED:
  1313.  
  1314.             Number = Config->EmulationConfig->CursorLocked;
  1315.             break;
  1316.  
  1317.         case ATTR_PREFS_EMULATION_FONTLOCKED:
  1318.  
  1319.             Number = Config->EmulationConfig->FontLocked;
  1320.             break;
  1321.  
  1322.         case ATTR_PREFS_EMULATION_NUMPADLOCKED:
  1323.  
  1324.             Number = Config->EmulationConfig->KeysLocked;
  1325.             break;
  1326.  
  1327.         case ATTR_PREFS_EMULATION_WRAPLOCKED:
  1328.  
  1329.             Number = Config->EmulationConfig->LockWrapping;
  1330.             break;
  1331.  
  1332.         case ATTR_PREFS_EMULATION_NUMERICMODE:
  1333.  
  1334.             Number = Config->EmulationConfig->NumericMode;
  1335.             break;
  1336.  
  1337.         case ATTR_PREFS_EMULATION_CURSORWRAP:
  1338.  
  1339.             Number = Config->EmulationConfig->CursorWrap;
  1340.             break;
  1341.  
  1342.         case ATTR_PREFS_EMULATION_LINEWRAP:
  1343.  
  1344.             Number = Config->EmulationConfig->LineWrap;
  1345.             break;
  1346.  
  1347.         case ATTR_PREFS_EMULATION_INSERTMODE:
  1348.  
  1349.             Number = Config->EmulationConfig->InsertMode;
  1350.             break;
  1351.  
  1352.         case ATTR_PREFS_EMULATION_NEWLINEMODE:
  1353.  
  1354.             Number = Config->EmulationConfig->NewLineMode;
  1355.             break;
  1356.  
  1357.         case ATTR_PREFS_EMULATION_SCROLLMODE:
  1358.  
  1359.             Number = Config->EmulationConfig->ScrollMode;
  1360.             break;
  1361.  
  1362.         case ATTR_PREFS_EMULATION_DESTRUCTIVEBACKSPACE:
  1363.  
  1364.             Number = Config->EmulationConfig->DestructiveBackspace;
  1365.             break;
  1366.  
  1367.         case ATTR_PREFS_EMULATION_SWAPBSDELETE:
  1368.  
  1369.             Number = Config->EmulationConfig->SwapBSDelete;
  1370.             break;
  1371.  
  1372.         case ATTR_PREFS_EMULATION_PRINTERENABLED:
  1373.  
  1374.             Number = Config->EmulationConfig->PrinterEnabled;
  1375.             break;
  1376.  
  1377.         case ATTR_PREFS_EMULATION_ANSWERBACKTEXT:
  1378.  
  1379.             String = Config->EmulationConfig->AnswerBack;
  1380.             break;
  1381.  
  1382.         case ATTR_PREFS_EMULATION_CLS_RESETS_CURSOR:
  1383.  
  1384.             Number = Config->EmulationConfig->CLSResetsCursor;
  1385.             break;
  1386.  
  1387.         case ATTR_PREFS_EMULATION_MAXSCROLL:
  1388.  
  1389.             Number = Config->EmulationConfig->MaxScroll;
  1390.             break;
  1391.  
  1392.         case ATTR_PREFS_EMULATION_MAXJUMP:
  1393.  
  1394.             Number = Config->EmulationConfig->MaxJump;
  1395.             break;
  1396.  
  1397.         case ATTR_PREFS_TRANSFER_DEFAULT_LIBRARY:
  1398.  
  1399.             String = Config->TransferConfig->DefaultLibrary;
  1400.             break;
  1401.  
  1402.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_LIBRARY:
  1403.  
  1404.             String = Config->TransferConfig->ASCIIUploadLibrary;
  1405.             break;
  1406.  
  1407.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_LIBRARY:
  1408.  
  1409.             String = Config->TransferConfig->ASCIIDownloadLibrary;
  1410.             break;
  1411.  
  1412.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_LIBRARY:
  1413.  
  1414.             String = Config->TransferConfig->TextUploadLibrary;
  1415.             break;
  1416.  
  1417.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_LIBRARY:
  1418.  
  1419.             String = Config->TransferConfig->TextDownloadLibrary;
  1420.             break;
  1421.  
  1422.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_LIBRARY:
  1423.  
  1424.             String = Config->TransferConfig->BinaryUploadLibrary;
  1425.             break;
  1426.  
  1427.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_LIBRARY:
  1428.  
  1429.             String = Config->TransferConfig->BinaryDownloadLibrary;
  1430.             break;
  1431.  
  1432.         case ATTR_PREFS_TRANSFER_INTERNAL_ASCII_DOWNLOAD:
  1433.  
  1434.             Number = Config->TransferConfig->InternalASCIIDownload;
  1435.             break;
  1436.  
  1437.         case ATTR_PREFS_TRANSFER_INTERNAL_ASCII_UPLOAD:
  1438.  
  1439.             Number = Config->TransferConfig->InternalASCIIUpload;
  1440.             break;
  1441.  
  1442.         case ATTR_PREFS_TRANSFER_QUIET_TRANSFER:
  1443.  
  1444.             Number = Config->TransferConfig->QuietTransfer;
  1445.             break;
  1446.  
  1447.         case ATTR_PREFS_TRANSFER_MANGLE_FILE_NAMES:
  1448.  
  1449.             Number = Config->TransferConfig->MangleFileNames;
  1450.             break;
  1451.  
  1452.         case ATTR_PREFS_TRANSFER_STRIP_BIT_8:
  1453.  
  1454.             Number = Config->TransferConfig->StripBit8;
  1455.             break;
  1456.  
  1457.         case ATTR_PREFS_TRANSFER_IGNORE_DATA_PAST_ARNOLD:
  1458.  
  1459.             Number = Config->TransferConfig->IgnoreDataPastArnold;
  1460.             break;
  1461.  
  1462.         case ATTR_PREFS_TRANSFER_TERMINATOR_CHAR:
  1463.  
  1464.             Number = Config->TransferConfig->TerminatorChar;
  1465.             break;
  1466.  
  1467.         case ATTR_PREFS_TRANSFER_LINEDELAY:
  1468.  
  1469.             Number = Config->TransferConfig->LineDelay;
  1470.             break;
  1471.  
  1472.         case ATTR_PREFS_TRANSFER_CHARDELAY:
  1473.  
  1474.             Number = Config->TransferConfig->CharDelay;
  1475.             break;
  1476.  
  1477.         case ATTR_PREFS_TRANSFER_LINEPROMPT:
  1478.  
  1479.             String = Config->TransferConfig->LinePrompt;
  1480.             break;
  1481.  
  1482.         case ATTR_PREFS_TRANSFER_TEXTPACING:
  1483.  
  1484.             Number = Config->TransferConfig->PacingMode;
  1485.             break;
  1486.  
  1487.         case ATTR_PREFS_TRANSFER_SENDTIMEOUT:
  1488.  
  1489.             Number = Config->TransferConfig->SendTimeout;
  1490.             break;
  1491.  
  1492.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_COUNT:
  1493.  
  1494.             Number = Config->TransferConfig->ErrorNotification;
  1495.             break;
  1496.  
  1497.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_WHEN:
  1498.  
  1499.             Number = Config->TransferConfig->TransferNotification;
  1500.             break;
  1501.  
  1502.         case ATTR_PREFS_TRANSFER_DEFAULT_TYPE:
  1503.  
  1504.             Number = Config->TransferConfig->DefaultType;
  1505.             break;
  1506.  
  1507.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_TYPE:
  1508.  
  1509.             Number = Config->TransferConfig->ASCIIUploadType;
  1510.             break;
  1511.  
  1512.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_TYPE:
  1513.  
  1514.             Number = Config->TransferConfig->ASCIIDownloadType;
  1515.             break;
  1516.  
  1517.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_TYPE:
  1518.  
  1519.             Number = Config->TransferConfig->TextUploadType;
  1520.             break;
  1521.  
  1522.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_TYPE:
  1523.  
  1524.             Number = Config->TransferConfig->TextDownloadType;
  1525.             break;
  1526.  
  1527.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_TYPE:
  1528.  
  1529.             Number = Config->TransferConfig->BinaryUploadType;
  1530.             break;
  1531.  
  1532.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_TYPE:
  1533.  
  1534.             Number = Config->TransferConfig->BinaryDownloadType;
  1535.             break;
  1536.  
  1537.         case ATTR_PREFS_TRANSFER_DEFAULT_SEND_SIGNATURE:
  1538.  
  1539.             TranslateBack(Config->TransferConfig->Signatures[TRANSFERSIG_DEFAULTUPLOAD].Signature,Config->TransferConfig->Signatures[TRANSFERSIG_DEFAULTUPLOAD].Length,ResultBuffer,sizeof(ResultBuffer));
  1540.  
  1541.             String = ResultBuffer;
  1542.             break;
  1543.  
  1544.         case ATTR_PREFS_TRANSFER_DEFAULT_RECEIVE_SIGNATURE:
  1545.  
  1546.             TranslateBack(Config->TransferConfig->Signatures[TRANSFERSIG_DEFAULTDOWNLOAD].Signature,Config->TransferConfig->Signatures[TRANSFERSIG_DEFAULTDOWNLOAD].Length,ResultBuffer,sizeof(ResultBuffer));
  1547.  
  1548.             String = ResultBuffer;
  1549.             break;
  1550.  
  1551.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_SIGNATURE:
  1552.  
  1553.             TranslateBack(Config->TransferConfig->Signatures[TRANSFERSIG_ASCIIUPLOAD].Signature,Config->TransferConfig->Signatures[TRANSFERSIG_ASCIIUPLOAD].Length,ResultBuffer,sizeof(ResultBuffer));
  1554.  
  1555.             String = ResultBuffer;
  1556.             break;
  1557.  
  1558.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_SIGNATURE:
  1559.  
  1560.             TranslateBack(Config->TransferConfig->Signatures[TRANSFERSIG_ASCIIDOWNLOAD].Signature,Config->TransferConfig->Signatures[TRANSFERSIG_ASCIIDOWNLOAD].Length,ResultBuffer,sizeof(ResultBuffer));
  1561.  
  1562.             String = ResultBuffer;
  1563.             break;
  1564.  
  1565.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_SIGNATURE:
  1566.  
  1567.             TranslateBack(Config->TransferConfig->Signatures[TRANSFERSIG_TEXTUPLOAD].Signature,Config->TransferConfig->Signatures[TRANSFERSIG_TEXTUPLOAD].Length,ResultBuffer,sizeof(ResultBuffer));
  1568.  
  1569.             String = ResultBuffer;
  1570.             break;
  1571.  
  1572.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_SIGNATURE:
  1573.  
  1574.             TranslateBack(Config->TransferConfig->Signatures[TRANSFERSIG_TEXTDOWNLOAD].Signature,Config->TransferConfig->Signatures[TRANSFERSIG_TEXTDOWNLOAD].Length,ResultBuffer,sizeof(ResultBuffer));
  1575.  
  1576.             String = ResultBuffer;
  1577.             break;
  1578.  
  1579.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_SIGNATURE:
  1580.  
  1581.             TranslateBack(Config->TransferConfig->Signatures[TRANSFERSIG_BINARYUPLOAD].Signature,Config->TransferConfig->Signatures[TRANSFERSIG_BINARYUPLOAD].Length,ResultBuffer,sizeof(ResultBuffer));
  1582.  
  1583.             String = ResultBuffer;
  1584.             break;
  1585.  
  1586.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_SIGNATURE:
  1587.  
  1588.             TranslateBack(Config->TransferConfig->Signatures[TRANSFERSIG_BINARYDOWNLOAD].Signature,Config->TransferConfig->Signatures[TRANSFERSIG_BINARYDOWNLOAD].Length,ResultBuffer,sizeof(ResultBuffer));
  1589.  
  1590.             String = ResultBuffer;
  1591.             break;
  1592.  
  1593.         case ATTR_PREFS_TRANSFER_IDENTIFY_COMMAND:
  1594.  
  1595.             String = Config->TransferConfig->IdentifyCommand;
  1596.             break;
  1597.  
  1598.         case ATTR_PREFS_SPEECH_RATE:
  1599.  
  1600.             Number = SpeechConfig.Rate;
  1601.             break;
  1602.  
  1603.         case ATTR_PREFS_SPEECH_PITCH:
  1604.  
  1605.             Number = SpeechConfig.Pitch;
  1606.             break;
  1607.  
  1608.         case ATTR_PREFS_SPEECH_FREQUENCY:
  1609.  
  1610.             Number = SpeechConfig.Frequency;
  1611.             break;
  1612.  
  1613.         case ATTR_PREFS_SPEECH_SEXMODE:
  1614.  
  1615.             Number = SpeechConfig.Sex;
  1616.             break;
  1617.  
  1618.         case ATTR_PREFS_SPEECH_VOLUME:
  1619.  
  1620.             Number = (100 * SpeechConfig.Volume) / 64;
  1621.             break;
  1622.  
  1623.         case ATTR_PREFS_SPEECH_SPEECH:
  1624.  
  1625.             Number = SpeechConfig.Enabled;
  1626.             break;
  1627.  
  1628.         case ATTR_PREFS_TRANSLATIONS_X_SEND:
  1629.  
  1630.             if(Count1 < 0 || Count1 > 255)
  1631.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1632.             else
  1633.             {
  1634.                 STRPTR Str;
  1635.                 LONG Len;
  1636.                 UBYTE c;
  1637.  
  1638.                 c = Count1;
  1639.                 Len = 1;
  1640.                 Str = &c;
  1641.  
  1642.                 if(SendTable && SendTable[Count1])
  1643.                 {
  1644.                     Str = SendTable[Count1]->String;
  1645.                     Len = SendTable[Count1]->Len;
  1646.                 }
  1647.  
  1648.                 TranslateBack(Str,Len,ResultBuffer,sizeof(ResultBuffer));
  1649.  
  1650.                 String = ResultBuffer;
  1651.             }
  1652.  
  1653.             break;
  1654.  
  1655.         case ATTR_PREFS_TRANSLATIONS_X_RECEIVE:
  1656.  
  1657.             if(Count1 < 0 || Count1 > 255)
  1658.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1659.             else
  1660.             {
  1661.                 STRPTR Str;
  1662.                 LONG Len;
  1663.                 UBYTE c;
  1664.  
  1665.                 c = Count1;
  1666.                 Len = 1;
  1667.                 Str = &c;
  1668.  
  1669.                 if(ReceiveTable)
  1670.                 {
  1671.                     if(ReceiveTable[Count1])
  1672.                     {
  1673.                         Str = ReceiveTable[Count1]->String;
  1674.                         Len = ReceiveTable[Count1]->Len;
  1675.                     }
  1676.                 }
  1677.  
  1678.                 TranslateBack(Str,Len,ResultBuffer,sizeof(ResultBuffer));
  1679.             }
  1680.  
  1681.             String = ResultBuffer;
  1682.  
  1683.             break;
  1684.  
  1685.         case ATTR_PREFS_FASTMACROS_COUNT:
  1686.  
  1687.             Number = FastMacroCount;
  1688.             break;
  1689.  
  1690.         case ATTR_PREFS_FASTMACROS_X_NAME:
  1691.  
  1692.             if(Count1 < FastMacroCount && Count1 >= 0)
  1693.             {
  1694.                 struct MacroNode *Node;
  1695.  
  1696.                 Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  1697.  
  1698.                 String = Node->Macro;
  1699.             }
  1700.             else
  1701.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1702.  
  1703.             break;
  1704.  
  1705.         case ATTR_PREFS_FASTMACROS_X_CODE:
  1706.  
  1707.             if(Count1 < FastMacroCount && Count1 >= 0)
  1708.             {
  1709.                 struct MacroNode *Node;
  1710.  
  1711.                 Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  1712.  
  1713.                 String = Node->Code;
  1714.             }
  1715.             else
  1716.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1717.  
  1718.             break;
  1719.  
  1720.         case ATTR_PREFS_HOTKEYS_TERMSCREENTOFRONTTEXT:
  1721.  
  1722.             String = Hotkeys.termScreenToFront;
  1723.             break;
  1724.  
  1725.         case ATTR_PREFS_HOTKEYS_BUFFERSCREENTOFRONTTEXT:
  1726.  
  1727.             String = Hotkeys.BufferScreenToFront;
  1728.             break;
  1729.  
  1730.         case ATTR_PREFS_HOTKEYS_SKIPDIALENTRYTEXT:
  1731.  
  1732.             String = Hotkeys.SkipDialEntry;
  1733.             break;
  1734.  
  1735.         case ATTR_PREFS_HOTKEYS_ABORTAREXX:
  1736.  
  1737.             String = Hotkeys.AbortARexx;
  1738.             break;
  1739.  
  1740.         case ATTR_PREFS_HOTKEYS_COMMODITYPRIORITY:
  1741.  
  1742.             Number = Hotkeys.CommodityPriority;
  1743.             break;
  1744.  
  1745.         case ATTR_PREFS_HOTKEYS_HOTKEYSENABLED:
  1746.  
  1747.             Number = Hotkeys.HotkeysEnabled;
  1748.             break;
  1749.  
  1750.         case ATTR_PREFS_CURSORKEYS_UPTEXT:
  1751.  
  1752.             String = CursorKeys->Keys[0][0];
  1753.             break;
  1754.  
  1755.         case ATTR_PREFS_CURSORKEYS_RIGHTTEXT:
  1756.  
  1757.             String = CursorKeys->Keys[0][1];
  1758.             break;
  1759.  
  1760.         case ATTR_PREFS_CURSORKEYS_DOWNTEXT:
  1761.  
  1762.             String = CursorKeys->Keys[0][2];
  1763.             break;
  1764.  
  1765.         case ATTR_PREFS_CURSORKEYS_LEFTTEXT:
  1766.  
  1767.             String = CursorKeys->Keys[0][3];
  1768.             break;
  1769.  
  1770.         case ATTR_PREFS_CURSORKEYS_SHIFT_UPTEXT:
  1771.  
  1772.             String = CursorKeys->Keys[1][0];
  1773.             break;
  1774.  
  1775.         case ATTR_PREFS_CURSORKEYS_SHIFT_RIGHTTEXT:
  1776.  
  1777.             String = CursorKeys->Keys[1][1];
  1778.             break;
  1779.  
  1780.         case ATTR_PREFS_CURSORKEYS_SHIFT_DOWNTEXT:
  1781.  
  1782.             String = CursorKeys->Keys[1][2];
  1783.             break;
  1784.  
  1785.         case ATTR_PREFS_CURSORKEYS_SHIFT_LEFTTEXT:
  1786.  
  1787.             String = CursorKeys->Keys[1][3];
  1788.             break;
  1789.  
  1790.         case ATTR_PREFS_CURSORKEYS_ALT_UPTEXT:
  1791.  
  1792.             String = CursorKeys->Keys[2][0];
  1793.             break;
  1794.  
  1795.         case ATTR_PREFS_CURSORKEYS_ALT_RIGHTTEXT:
  1796.  
  1797.             String = CursorKeys->Keys[2][1];
  1798.             break;
  1799.  
  1800.         case ATTR_PREFS_CURSORKEYS_ALT_DOWNTEXT:
  1801.  
  1802.             String = CursorKeys->Keys[2][2];
  1803.             break;
  1804.  
  1805.         case ATTR_PREFS_CURSORKEYS_ALT_LEFTTEXT:
  1806.  
  1807.             String = CursorKeys->Keys[2][3];
  1808.             break;
  1809.  
  1810.         case ATTR_PREFS_CURSORKEYS_CONTROL_UPTEXT:
  1811.  
  1812.             String = CursorKeys->Keys[3][0];
  1813.             break;
  1814.  
  1815.         case ATTR_PREFS_CURSORKEYS_CONTROL_RIGHTTEXT:
  1816.  
  1817.             String = CursorKeys->Keys[3][1];
  1818.             break;
  1819.  
  1820.         case ATTR_PREFS_CURSORKEYS_CONTROL_DOWNTEXT:
  1821.  
  1822.             String = CursorKeys->Keys[3][2];
  1823.             break;
  1824.  
  1825.         case ATTR_PREFS_CURSORKEYS_CONTROL_LEFTTEXT:
  1826.  
  1827.             String = CursorKeys->Keys[3][3];
  1828.             break;
  1829.  
  1830.         case ATTR_PREFS_FUNCTIONKEYS_X:
  1831.  
  1832.             if(Count1 < 1 || Count1 > 10)
  1833.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1834.             else
  1835.                 String = MacroKeys->Keys[0][Count1 - 1];
  1836.  
  1837.             break;
  1838.  
  1839.         case ATTR_PREFS_FUNCTIONKEYS_SHIFT_X:
  1840.  
  1841.             if(Count1 < 1 || Count1 > 10)
  1842.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1843.             else
  1844.                 String = MacroKeys->Keys[1][Count1 - 1];
  1845.  
  1846.             break;
  1847.  
  1848.         case ATTR_PREFS_FUNCTIONKEYS_ALT_X:
  1849.  
  1850.             if(Count1 < 1 || Count1 > 10)
  1851.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1852.             else
  1853.                 String = MacroKeys->Keys[2][Count1 - 1];
  1854.  
  1855.             break;
  1856.  
  1857.         case ATTR_PREFS_FUNCTIONKEYS_CONTROL_X:
  1858.  
  1859.             if(Count1 < 1 || Count1 > 10)
  1860.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1861.             else
  1862.                 String = MacroKeys->Keys[3][Count1 - 1];
  1863.  
  1864.             break;
  1865.  
  1866.         case ATTR_PREFS_PROTOCOL:
  1867.  
  1868.             String = ProtocolOptsBuffer;
  1869.             break;
  1870.  
  1871.         case ATTR_PREFS_MISC_CONSOLEWINDOW:
  1872.         case ATTR_PREFS_CONSOLE:
  1873.  
  1874.             String = Config->MiscConfig->WindowName;
  1875.             break;
  1876.  
  1877.         case ATTR_PHONEBOOK_COUNT:
  1878.  
  1879.             Number = GlobalPhoneHandle->NumPhoneEntries;
  1880.             break;
  1881.  
  1882.         case ATTR_PHONEBOOK_X_NAME:
  1883.  
  1884.             if(Count1 < GlobalPhoneHandle->NumPhoneEntries && Count1 >= 0)
  1885.                 String = GlobalPhoneHandle->Phonebook[Count1]->Header->Name;
  1886.             else
  1887.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1888.  
  1889.             break;
  1890.  
  1891.         case ATTR_PHONEBOOK_X_NUMBER:
  1892.  
  1893.             if(Count1 < GlobalPhoneHandle->NumPhoneEntries && Count1 >= 0)
  1894.                 String = GlobalPhoneHandle->Phonebook[Count1]->Header->Number;
  1895.             else
  1896.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1897.  
  1898.             break;
  1899.  
  1900.         case ATTR_PHONEBOOK_X_COMMENTTEXT:
  1901.  
  1902.             if(Count1 < GlobalPhoneHandle->NumPhoneEntries && Count1 >= 0)
  1903.                 String = GlobalPhoneHandle->Phonebook[Count1]->Header->Comment;
  1904.             else
  1905.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1906.  
  1907.             break;
  1908.  
  1909.         case ATTR_PHONEBOOK_X_USERNAME:
  1910.  
  1911.             if(Count1 < GlobalPhoneHandle->NumPhoneEntries && Count1 >= 0)
  1912.                 String = GlobalPhoneHandle->Phonebook[Count1]->Header->UserName;
  1913.             else
  1914.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1915.  
  1916.             break;
  1917.  
  1918.         case ATTR_PHONEBOOK_X_PASSWORDTEXT:
  1919.  
  1920.             if(Count1 < GlobalPhoneHandle->NumPhoneEntries && Count1 >= 0)
  1921.                 String = GlobalPhoneHandle->Phonebook[Count1]->Header->Password;
  1922.             else
  1923.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1924.  
  1925.             break;
  1926.  
  1927.         case ATTR_PREFS_SOUND_BELLNAME:
  1928.  
  1929.             String = SoundConfig.BellFile;
  1930.             break;
  1931.  
  1932.         case ATTR_PREFS_SOUND_ERROR:
  1933.  
  1934.             String = SoundConfig.ErrorNotifyFile;
  1935.             break;
  1936.  
  1937.         case ATTR_PREFS_SOUND_CONNECTNAME:
  1938.  
  1939.             String = SoundConfig.ConnectFile;
  1940.             break;
  1941.  
  1942.         case ATTR_PREFS_SOUND_DISCONNECTNAME:
  1943.  
  1944.             String = SoundConfig.DisconnectFile;
  1945.             break;
  1946.  
  1947.         case ATTR_PREFS_SOUND_GOODTRANSFERNAME:
  1948.  
  1949.             String = SoundConfig.GoodTransferFile;
  1950.             break;
  1951.  
  1952.         case ATTR_PREFS_SOUND_BADTRANSFERNAME:
  1953.  
  1954.             String = SoundConfig.BadTransferFile;
  1955.             break;
  1956.  
  1957.         case ATTR_PREFS_SOUND_RINGNAME:
  1958.  
  1959.             String = SoundConfig.RingFile;
  1960.             break;
  1961.  
  1962.         case ATTR_PREFS_SOUND_VOICENAME:
  1963.  
  1964.             String = SoundConfig.VoiceFile;
  1965.             break;
  1966.  
  1967.         case ATTR_PREFS_SOUND_PRELOAD:
  1968.  
  1969.             Number = SoundConfig.Preload;
  1970.             break;
  1971.  
  1972.         case ATTR_PREFS_SOUND_VOLUME:
  1973.  
  1974.             Number = SoundConfig.Volume;
  1975.             break;
  1976.     }
  1977.  
  1978.     if(!Error)
  1979.     {
  1980.         switch(AttributeTable[Index].Type)
  1981.         {
  1982.             case INFO_TEXT:
  1983.  
  1984.                 *Result = String;
  1985.  
  1986.                 break;
  1987.  
  1988.             case INFO_NUMERIC:
  1989.  
  1990.                 LimitedSPrintf(sizeof(ResultBuffer),ResultBuffer,"%ld",Number);
  1991.  
  1992.                 *Result = ResultBuffer;
  1993.  
  1994.                 break;
  1995.  
  1996.             case INFO_BOOLEAN:
  1997.  
  1998.                 *Result = ToBoolean(Number);
  1999.  
  2000.                 break;
  2001.  
  2002.             case INFO_MAPPED:
  2003.  
  2004.                 *Result = ToMap(Number,AttributeTable[Index].Mappings);
  2005.  
  2006.                 break;
  2007.         }
  2008.     }
  2009.  
  2010.     return(Error);
  2011. }
  2012.  
  2013.     /* SetSingleAttribute(LONG ID,LONG Index,LONG Count1,STRPTR Input):
  2014.      *
  2015.      *    Beware the MONSTER!
  2016.      */
  2017.  
  2018. STATIC LONG
  2019. SetSingleAttribute(LONG ID,LONG Index,LONG Count1,STRPTR Input)
  2020. {
  2021.     LONG Number,Error,i;
  2022.     STRPTR String;
  2023.  
  2024.     Error    = 0;
  2025.     String    = NULL;
  2026.     Number    = 0;
  2027.  
  2028.     switch(AttributeTable[Index].Type)
  2029.     {
  2030.         case INFO_TEXT:
  2031.  
  2032.             String = Input;
  2033.             break;
  2034.  
  2035.         case INFO_NUMERIC:
  2036.  
  2037.             Number = Atol(Input);
  2038.             break;
  2039.  
  2040.         case INFO_BOOLEAN:
  2041.  
  2042.             Number = FromBoolean(Input);
  2043.             break;
  2044.  
  2045.         case INFO_MAPPED:
  2046.  
  2047.             if((Number = FromMap(Input,AttributeTable[Index].Mappings)) == -1)
  2048.                 return(ERROR_TOO_MANY_ARGS);
  2049.             else
  2050.                 break;
  2051.     }
  2052.  
  2053.     UpdateRequired            = TRUE;
  2054.     TransferUpdateRequired    = FALSE;
  2055.  
  2056.     switch(ID)
  2057.     {
  2058.         case ATTR_PREFS_SERIAL_BAUDRATE:
  2059.         {
  2060.             ULONG Rate;
  2061.  
  2062.             Rate = 0;
  2063.  
  2064.             for(i = 0 ; i < NumBaudRates ; i++)
  2065.             {
  2066.                 if(BaudRates[i] >= Number)
  2067.                 {
  2068.                     Rate = BaudRates[i];
  2069.  
  2070.                     break;
  2071.                 }
  2072.             }
  2073.  
  2074.             if(Rate && Rate != Config->SerialConfig->BaudRate)
  2075.             {
  2076.                 Config->SerialConfig->BaudRate = Rate;
  2077.  
  2078.                 ConfigChanged = TRUE;
  2079.  
  2080.                 UpdateRequired = TRUE;
  2081.             }
  2082.  
  2083.             break;
  2084.         }
  2085.  
  2086.         case ATTR_PREFS_SERIAL_OWNDEVUNIT_REQUEST:
  2087.  
  2088.             Config->SerialConfig->SatisfyODURequests = Number;
  2089.  
  2090.             ConfigChanged = TRUE;
  2091.  
  2092.             break;
  2093.  
  2094.         case ATTR_PREFS_SERIAL_DIRECT_CONNECTION:
  2095.  
  2096.             Config->SerialConfig->DirectConnection = Number;
  2097.  
  2098.             ConfigChanged = TRUE;
  2099.  
  2100.             break;
  2101.  
  2102.         case ATTR_PREFS_SERIAL_BREAKLENGTH:
  2103.  
  2104.             Config->SerialConfig->BreakLength = Number;
  2105.  
  2106.             UpdateRequired = ConfigChanged = TRUE;
  2107.  
  2108.             break;
  2109.  
  2110.         case ATTR_PREFS_SERIAL_BUFFERSIZE:
  2111.  
  2112.             for(i = 9 ; i <= 19 ; i++)
  2113.             {
  2114.                 if(1L << i >= Number)
  2115.                 {
  2116.                     Config->SerialConfig->SerialBufferSize = 1L << i;
  2117.  
  2118.                     Update_CR_LF_Translation();
  2119.  
  2120.                     UpdateRequired = ConfigChanged = TRUE;
  2121.  
  2122.                     break;
  2123.                 }
  2124.             }
  2125.  
  2126.             break;
  2127.  
  2128.         case ATTR_PREFS_SERIAL_QUANTUM:
  2129.  
  2130.             for(i = 8 ; i <= 19 ; i++)
  2131.             {
  2132.                 if(1L << i >= Number)
  2133.                 {
  2134.                     Config->SerialConfig->Quantum = 1L << i;
  2135.  
  2136.                     UpdateRequired = ConfigChanged = TRUE;
  2137.  
  2138.                     break;
  2139.                 }
  2140.             }
  2141.  
  2142.             break;
  2143.  
  2144.         case ATTR_PREFS_SERIAL_DEVICENAME:
  2145.  
  2146.             strcpy(Config->SerialConfig->SerialDevice,String);
  2147.  
  2148.             UpdateRequired = ConfigChanged = TRUE;
  2149.  
  2150.             break;
  2151.  
  2152.         case ATTR_PREFS_SERIAL_UNIT:
  2153.  
  2154.             if(Number >= 0)
  2155.             {
  2156.                 Config->SerialConfig->UnitNumber = Number;
  2157.  
  2158.                 UpdateRequired = ConfigChanged = TRUE;
  2159.             }
  2160.             else
  2161.                 Error = TERMERROR_UNIT_NOT_AVAILABLE;
  2162.  
  2163.             break;
  2164.  
  2165.         case ATTR_PREFS_SERIAL_BITSPERCHAR:
  2166.  
  2167.             if(Number < 7 || Number > 8)
  2168.             {
  2169.                 Error = ERROR_BAD_NUMBER;
  2170.  
  2171.                 UpdateRequired = ConfigChanged = TRUE;
  2172.             }
  2173.             else
  2174.                 Config->SerialConfig->BitsPerChar = Number;
  2175.  
  2176.             break;
  2177.  
  2178.         case ATTR_PREFS_SERIAL_PARITYMODE:
  2179.  
  2180.             Config->SerialConfig->Parity = Number;
  2181.  
  2182.             UpdateRequired = ConfigChanged = TRUE;
  2183.  
  2184.             break;
  2185.  
  2186.         case ATTR_PREFS_SERIAL_STOPBITS:
  2187.  
  2188.             if(Number < 0 || Number > 1)
  2189.                 Error = ERROR_BAD_NUMBER;
  2190.             else
  2191.             {
  2192.                 Config->SerialConfig->StopBits = Number;
  2193.  
  2194.                 UpdateRequired = ConfigChanged = TRUE;
  2195.             }
  2196.  
  2197.             break;
  2198.  
  2199.         case ATTR_PREFS_SERIAL_HANDSHAKINGMODE:
  2200.  
  2201.             Config->SerialConfig->HandshakingProtocol = Number;
  2202.  
  2203.             UpdateRequired = ConfigChanged = TRUE;
  2204.  
  2205.             break;
  2206.  
  2207.         case ATTR_PREFS_SERIAL_DUPLEXMODE:
  2208.  
  2209.             Config->SerialConfig->Duplex = Number;
  2210.  
  2211.             ConfigChanged = TRUE;
  2212.  
  2213.             break;
  2214.  
  2215.         case ATTR_PREFS_SERIAL_XONXOFF:
  2216.  
  2217.             Config->SerialConfig->xONxOFF = Number;
  2218.  
  2219.             ConfigChanged = TRUE;
  2220.  
  2221.             break;
  2222.  
  2223.         case ATTR_PREFS_SERIAL_HIGHSPEED:
  2224.  
  2225.             Config->SerialConfig->HighSpeed = Number;
  2226.  
  2227.             UpdateRequired = ConfigChanged = TRUE;
  2228.  
  2229.             break;
  2230.  
  2231.         case ATTR_PREFS_SERIAL_SHARED:
  2232.  
  2233.             Config->SerialConfig->Shared = Number;
  2234.  
  2235.             UpdateRequired = ConfigChanged = TRUE;
  2236.  
  2237.             break;
  2238.  
  2239.         case ATTR_PREFS_SERIAL_STRIPBIT8:
  2240.  
  2241.             Config->SerialConfig->StripBit8 = Number;
  2242.  
  2243.             ConfigChanged = TRUE;
  2244.  
  2245.             break;
  2246.  
  2247.         case ATTR_PREFS_SERIAL_CARRIERCHECK:
  2248.  
  2249.             Config->SerialConfig->CheckCarrier = Number;
  2250.  
  2251.             ConfigChanged = TRUE;
  2252.  
  2253.             break;
  2254.  
  2255.         case ATTR_PREFS_SERIAL_PASSXONXOFFTHROUGH:
  2256.  
  2257.             Config->SerialConfig->PassThrough = Number;
  2258.  
  2259.             ConfigChanged = TRUE;
  2260.  
  2261.             break;
  2262.  
  2263.         case ATTR_PREFS_SERIAL_USE_OWNDEVUNIT:
  2264.  
  2265.             Config->SerialConfig->UseOwnDevUnit = Number;
  2266.  
  2267.             UpdateRequired = ConfigChanged = TRUE;
  2268.  
  2269.             break;
  2270.  
  2271.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_ONLINE:
  2272.  
  2273.             Config->SerialConfig->ReleaseODUWhenOnline = Number;
  2274.  
  2275.             ConfigChanged = TRUE;
  2276.  
  2277.             break;
  2278.  
  2279.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_DIALING:
  2280.  
  2281.             Config->SerialConfig->ReleaseODUWhenDialing = Number;
  2282.  
  2283.             ConfigChanged = TRUE;
  2284.  
  2285.             break;
  2286.  
  2287.         case ATTR_PREFS_SERIAL_NO_ODU_IF_SHARED:
  2288.  
  2289.             Config->SerialConfig->NoODUIfShared = Number;
  2290.  
  2291.             ConfigChanged = TRUE;
  2292.  
  2293.             break;
  2294.  
  2295.         case ATTR_PREFS_SERIAL_LOCAL_ECHO:
  2296.  
  2297.             Config->SerialConfig->Duplex = Number;
  2298.  
  2299.             ConfigChanged = TRUE;
  2300.  
  2301.             break;
  2302.  
  2303.         case ATTR_PREFS_MODEM_DIAL_MODE:
  2304.  
  2305.             Config->ModemConfig->DialMode = Number;
  2306.  
  2307.             ConfigChanged = TRUE;
  2308.  
  2309.             break;
  2310.  
  2311.         case ATTR_PREFS_MODEM_PBX_MODE:
  2312.  
  2313.             Config->ModemConfig->PBX_Mode = Number;
  2314.  
  2315.             ConfigChanged = TRUE;
  2316.  
  2317.             break;
  2318.  
  2319.         case ATTR_PREFS_MODEM_PBX_PREFIX:
  2320.  
  2321.             strcpy(Config->ModemConfig->PBX_Prefix,String);
  2322.  
  2323.             ConfigChanged = TRUE;
  2324.  
  2325.             break;
  2326.  
  2327.         case ATTR_PREFS_MODEM_DO_NOT_SEND_COMMANDS:
  2328.  
  2329.             Config->ModemConfig->DoNotSendMainModemCommands = Number;
  2330.  
  2331.             ConfigChanged = TRUE;
  2332.  
  2333.             break;
  2334.  
  2335.         case ATTR_PREFS_MODEM_CHAR_SEND_DELAY:
  2336.  
  2337.             Config->ModemConfig->CharSendDelay = Number;
  2338.  
  2339.             ConfigChanged = TRUE;
  2340.  
  2341.             break;
  2342.  
  2343.         case ATTR_PREFS_MODEM_MODEMINITTEXT:
  2344.  
  2345.             strcpy(Config->ModemConfig->ModemInit,String);
  2346.  
  2347.             ConfigChanged = TRUE;
  2348.  
  2349.             break;
  2350.  
  2351.         case ATTR_PREFS_MODEM_MODEMEXITTEXT:
  2352.  
  2353.             strcpy(Config->ModemConfig->ModemExit,String);
  2354.  
  2355.             ConfigChanged = TRUE;
  2356.  
  2357.             break;
  2358.  
  2359.         case ATTR_PREFS_MODEM_MODEMHANGUPTEXT:
  2360.  
  2361.             strcpy(Config->ModemConfig->ModemHangup,String);
  2362.  
  2363.             ConfigChanged = TRUE;
  2364.  
  2365.             break;
  2366.  
  2367.         case ATTR_PREFS_MODEM_DIALPREFIXTEXT:
  2368.  
  2369.             strcpy(Config->ModemConfig->DialPrefix,String);
  2370.  
  2371.             ConfigChanged = TRUE;
  2372.  
  2373.             break;
  2374.  
  2375.         case ATTR_PREFS_MODEM_DIALSUFFIXTEXT:
  2376.  
  2377.             strcpy(Config->ModemConfig->DialSuffix,String);
  2378.  
  2379.             ConfigChanged = TRUE;
  2380.  
  2381.             break;
  2382.  
  2383.         case ATTR_PREFS_MODEM_NOCARRIERTEXT:
  2384.  
  2385.             strcpy(Config->ModemConfig->NoCarrier,String);
  2386.  
  2387.             ConfigChanged = TRUE;
  2388.  
  2389.             break;
  2390.  
  2391.         case ATTR_PREFS_MODEM_NODIALTONETEXT:
  2392.  
  2393.             strcpy(Config->ModemConfig->NoDialTone,String);
  2394.  
  2395.             ConfigChanged = TRUE;
  2396.  
  2397.             break;
  2398.  
  2399.         case ATTR_PREFS_MODEM_CONNECTTEXT:
  2400.  
  2401.             strcpy(Config->ModemConfig->Connect,String);
  2402.  
  2403.             ConfigChanged = TRUE;
  2404.  
  2405.             break;
  2406.  
  2407.         case ATTR_PREFS_MODEM_VOICETEXT:
  2408.  
  2409.             strcpy(Config->ModemConfig->Voice,String);
  2410.  
  2411.             ConfigChanged = TRUE;
  2412.  
  2413.             break;
  2414.  
  2415.         case ATTR_PREFS_MODEM_RINGTEXT:
  2416.  
  2417.             strcpy(Config->ModemConfig->Ring,String);
  2418.  
  2419.             ConfigChanged = TRUE;
  2420.  
  2421.             break;
  2422.  
  2423.         case ATTR_PREFS_MODEM_BUSYTEXT:
  2424.  
  2425.             strcpy(Config->ModemConfig->Busy,String);
  2426.  
  2427.             ConfigChanged = TRUE;
  2428.  
  2429.             break;
  2430.  
  2431.         case ATTR_PREFS_MODEM_OKTEXT:
  2432.  
  2433.             strcpy(Config->ModemConfig->Ok,String);
  2434.  
  2435.             ConfigChanged = TRUE;
  2436.  
  2437.             break;
  2438.  
  2439.         case ATTR_PREFS_MODEM_ERRORTEXT:
  2440.  
  2441.             strcpy(Config->ModemConfig->Error,String);
  2442.  
  2443.             ConfigChanged = TRUE;
  2444.  
  2445.             break;
  2446.  
  2447.         case ATTR_PREFS_MODEM_REDIALDELAY:
  2448.  
  2449.             if(Number >= 0)
  2450.             {
  2451.                 Config->ModemConfig->RedialDelay = Number;
  2452.  
  2453.                 ConfigChanged = TRUE;
  2454.             }
  2455.             else
  2456.                 Error = ERROR_BAD_NUMBER;
  2457.  
  2458.             break;
  2459.  
  2460.         case ATTR_PREFS_MODEM_DIALRETRIES:
  2461.  
  2462.             if(Number < 0)
  2463.                 Error = ERROR_BAD_NUMBER;
  2464.             else
  2465.             {
  2466.                 Config->ModemConfig->DialRetries = Number;
  2467.  
  2468.                 ConfigChanged = TRUE;
  2469.             }
  2470.  
  2471.             break;
  2472.  
  2473.         case ATTR_PREFS_MODEM_DIALTIMEOUT:
  2474.  
  2475.             if(Number < 0)
  2476.                 Error = ERROR_BAD_NUMBER;
  2477.             else
  2478.             {
  2479.                 Config->ModemConfig->DialTimeout = Number;
  2480.  
  2481.                 ConfigChanged = TRUE;
  2482.             }
  2483.  
  2484.             break;
  2485.  
  2486.         case ATTR_PREFS_MODEM_INTER_DIAL_DELAY:
  2487.  
  2488.             if(Number < 0)
  2489.                 Error = ERROR_BAD_NUMBER;
  2490.             else
  2491.             {
  2492.                 Config->ModemConfig->InterDialDelay = Number;
  2493.  
  2494.                 ConfigChanged = TRUE;
  2495.             }
  2496.  
  2497.             break;
  2498.  
  2499.         case ATTR_PREFS_MODEM_CONNECTAUTOBAUD:
  2500.  
  2501.             Config->ModemConfig->ConnectAutoBaud = Number;
  2502.  
  2503.             ConfigChanged = TRUE;
  2504.  
  2505.             break;
  2506.  
  2507.         case ATTR_PREFS_MODEM_HANGUPDROPSDTR:
  2508.  
  2509.             Config->ModemConfig->DropDTR = Number;
  2510.  
  2511.             ConfigChanged = TRUE;
  2512.  
  2513.             break;
  2514.  
  2515.         case ATTR_PREFS_MODEM_REDIALAFTERHANGUP:
  2516.  
  2517.             Config->ModemConfig->RedialAfterHangup = Number;
  2518.  
  2519.             ConfigChanged = TRUE;
  2520.  
  2521.             break;
  2522.  
  2523.         case ATTR_PREFS_MODEM_VERBOSEDIALING:
  2524.  
  2525.             Config->ModemConfig->VerboseDialing = Number;
  2526.  
  2527.             ConfigChanged = TRUE;
  2528.  
  2529.             break;
  2530.  
  2531.         case ATTR_PREFS_MODEM_NOCARRIERISBUSY:
  2532.  
  2533.             Config->ModemConfig->NoCarrierIsBusy = Number;
  2534.  
  2535.             ConfigChanged = TRUE;
  2536.  
  2537.             break;
  2538.  
  2539.         case ATTR_PREFS_MODEM_CONNECTLIMIT:
  2540.  
  2541.             if(Number > 1440)
  2542.                 Number = 1440;
  2543.  
  2544.             Config->ModemConfig->ConnectLimit = Number;
  2545.  
  2546.             ConfigChanged = TRUE;
  2547.  
  2548.             break;
  2549.  
  2550.         case ATTR_PREFS_MODEM_CONNECTLIMITMACRO:
  2551.  
  2552.             strcpy(Config->ModemConfig->ConnectLimitMacro,String);
  2553.  
  2554.             ConfigChanged = TRUE;
  2555.  
  2556.             break;
  2557.  
  2558.         case ATTR_PREFS_MODEM_TIME_TO_CONNECT:
  2559.  
  2560.             if(Number >= 0)
  2561.             {
  2562.                 Config->ModemConfig->TimeToConnect = Number;
  2563.  
  2564.                 ConfigChanged = TRUE;
  2565.             }
  2566.             else
  2567.                 Error = ERROR_BAD_NUMBER;
  2568.  
  2569.             break;
  2570.  
  2571.         case ATTR_PREFS_COMMANDS_STARTUPMACROTEXT:
  2572.  
  2573.             strcpy(Config->CommandConfig->StartupMacro,String);
  2574.  
  2575.             ConfigChanged = TRUE;
  2576.  
  2577.             break;
  2578.  
  2579.         case ATTR_PREFS_COMMANDS_LOGOFFMACROTEXT:
  2580.  
  2581.             strcpy(Config->CommandConfig->LogoffMacro,String);
  2582.  
  2583.             ConfigChanged = TRUE;
  2584.  
  2585.             break;
  2586.  
  2587.         case ATTR_PREFS_COMMANDS_UPLOADMACROTEXT:
  2588.  
  2589.             strcpy(Config->CommandConfig->UploadMacro,String);
  2590.  
  2591.             ConfigChanged = TRUE;
  2592.  
  2593.             break;
  2594.  
  2595.         case ATTR_PREFS_COMMANDS_DOWNLOADMACROTEXT:
  2596.  
  2597.             strcpy(Config->CommandConfig->DownloadMacro,String);
  2598.  
  2599.             ConfigChanged = TRUE;
  2600.  
  2601.             break;
  2602.  
  2603.         case ATTR_PREFS_COMMANDS_LOGINMACROTEXT:
  2604.  
  2605.             strcpy(Config->CommandConfig->LoginMacro,String);
  2606.  
  2607.             ConfigChanged = TRUE;
  2608.  
  2609.             break;
  2610.  
  2611.         case ATTR_PREFS_SCREEN_COLOURMODE:
  2612.  
  2613.             Config->ScreenConfig->ColourMode = Number;
  2614.  
  2615.             UpdateRequired = ConfigChanged = TRUE;
  2616.  
  2617.             Default2CurrentPalette(Config);
  2618.  
  2619.             break;
  2620.  
  2621.         case ATTR_PREFS_SCREEN_FONTNAME:
  2622.  
  2623.             strcpy(Config->ScreenConfig->FontName,String);
  2624.  
  2625.             UpdateRequired = ConfigChanged = TRUE;
  2626.  
  2627.             break;
  2628.  
  2629.         case ATTR_PREFS_SCREEN_FONTSIZE:
  2630.  
  2631.             if(Number < 1)
  2632.                 Error = ERROR_BAD_NUMBER;
  2633.             else
  2634.             {
  2635.                 Config->ScreenConfig->FontHeight = Number;
  2636.  
  2637.                 UpdateRequired = ConfigChanged = TRUE;
  2638.             }
  2639.  
  2640.             break;
  2641.  
  2642.         case ATTR_PREFS_SCREEN_MAKESCREENPUBLIC:
  2643.  
  2644.             Config->ScreenConfig->MakeScreenPublic = Number;
  2645.  
  2646.             UpdateRequired = ConfigChanged = TRUE;
  2647.  
  2648.             break;
  2649.  
  2650.         case ATTR_PREFS_SCREEN_SHANGHAIWINDOWS:
  2651.  
  2652.             break;
  2653.  
  2654.         case ATTR_PREFS_SCREEN_BLINKING:
  2655.  
  2656.             Config->ScreenConfig->Blinking = Number;
  2657.  
  2658.             UpdateRequired = ConfigChanged = TRUE;
  2659.  
  2660.             break;
  2661.  
  2662.         case ATTR_PREFS_SCREEN_FASTERLAYOUT:
  2663.  
  2664.             Config->ScreenConfig->FasterLayout = Number;
  2665.  
  2666.             UpdateRequired = ConfigChanged = TRUE;
  2667.  
  2668.             break;
  2669.  
  2670.         case ATTR_PREFS_SCREEN_TITLEBAR:
  2671.  
  2672.             Config->ScreenConfig->TitleBar = Number;
  2673.  
  2674.             UpdateRequired = ConfigChanged = TRUE;
  2675.  
  2676.             break;
  2677.  
  2678.         case ATTR_PREFS_SCREEN_STATUSLINEMODE:
  2679.  
  2680.             Config->ScreenConfig->StatusLine = Number;
  2681.  
  2682.             UpdateRequired = ConfigChanged = TRUE;
  2683.  
  2684.             break;
  2685.  
  2686.         case ATTR_PREFS_SCREEN_USEWORKBENCH:
  2687.  
  2688.             Config->ScreenConfig->UseWorkbench = Number;
  2689.  
  2690.             UpdateRequired = ConfigChanged = TRUE;
  2691.  
  2692.             break;
  2693.  
  2694.         case ATTR_PREFS_SCREEN_PUBSCREENNAME:
  2695.  
  2696.             strcpy(Config->ScreenConfig->PubScreenName,String);
  2697.  
  2698.             UpdateRequired = ConfigChanged = TRUE;
  2699.  
  2700.             break;
  2701.  
  2702.         case ATTR_PREFS_SCREEN_ONLINEDISPLAY:
  2703.  
  2704.             Config->ScreenConfig->TimeMode = Number;
  2705.  
  2706.             ConfigChanged = TRUE;
  2707.  
  2708.             break;
  2709.  
  2710.         case ATTR_PREFS_SCREEN_USEPENS:
  2711.  
  2712.             Config->ScreenConfig->UsePens = Number;
  2713.  
  2714.             UpdateRequired = ConfigChanged = TRUE;
  2715.  
  2716.             break;
  2717.  
  2718.         case ATTR_PREFS_SCREEN_WINDOW_BORDER:
  2719.  
  2720.             Config->ScreenConfig->ShareScreen = Number;
  2721.  
  2722.             UpdateRequired = ConfigChanged = TRUE;
  2723.  
  2724.             break;
  2725.  
  2726.         case ATTR_PREFS_SCREEN_SPLIT_STATUS:
  2727.  
  2728.             Config->ScreenConfig->SplitStatus = Number;
  2729.  
  2730.             UpdateRequired = ConfigChanged = TRUE;
  2731.  
  2732.             break;
  2733.  
  2734.         case ATTR_PREFS_TERMINAL_BELLMODE:
  2735.  
  2736.             Config->TerminalConfig->BellMode = Number;
  2737.  
  2738.             ConfigChanged = TRUE;
  2739.  
  2740.             break;
  2741.  
  2742.         case ATTR_PREFS_TERMINAL_EMULATIONMODE:
  2743.  
  2744.             Config->TerminalConfig->EmulationMode = Number;
  2745.  
  2746.             ConfigChanged = TRUE;
  2747.  
  2748.             break;
  2749.  
  2750.         case ATTR_PREFS_TERMINAL_FONTMODE:
  2751.  
  2752.             Config->TerminalConfig->FontMode = Number;
  2753.  
  2754.             ConfigChanged = TRUE;
  2755.  
  2756.             break;
  2757.  
  2758.         case ATTR_PREFS_TERMINAL_SENDCRMODE:
  2759.  
  2760.             Config->TerminalConfig->SendCR = Number;
  2761.  
  2762.             ConfigChanged = TRUE;
  2763.  
  2764.             break;
  2765.  
  2766.         case ATTR_PREFS_TERMINAL_SENDLFMODE:
  2767.  
  2768.             Config->TerminalConfig->SendLF = Number;
  2769.  
  2770.             ConfigChanged = TRUE;
  2771.  
  2772.             break;
  2773.  
  2774.         case ATTR_PREFS_TERMINAL_RECEIVECRMODE:
  2775.  
  2776.             Config->TerminalConfig->ReceiveCR = Number;
  2777.  
  2778.             Update_CR_LF_Translation();
  2779.  
  2780.             ConfigChanged = TRUE;
  2781.  
  2782.             break;
  2783.  
  2784.         case ATTR_PREFS_TERMINAL_RECEIVELFMODE:
  2785.  
  2786.             Config->TerminalConfig->ReceiveLF = Number;
  2787.  
  2788.             Update_CR_LF_Translation();
  2789.  
  2790.             ConfigChanged = TRUE;
  2791.  
  2792.             break;
  2793.  
  2794.         case ATTR_PREFS_TERMINAL_NUMCOLUMNS:
  2795.  
  2796.             if(Number < 0)
  2797.                 Number = 0;
  2798.  
  2799.             Config->TerminalConfig->NumColumns = Number;
  2800.  
  2801.             UpdateRequired = ConfigChanged = TRUE;
  2802.  
  2803.             break;
  2804.  
  2805.         case ATTR_PREFS_TERMINAL_NUMLINES:
  2806.  
  2807.             if(Number < 0)
  2808.                 Number = 0;
  2809.  
  2810.             Config->TerminalConfig->NumLines = Number;
  2811.  
  2812.             UpdateRequired = ConfigChanged = TRUE;
  2813.  
  2814.             break;
  2815.  
  2816.         case ATTR_PREFS_TERMINAL_KEYMAPNAME:
  2817.  
  2818.             strcpy(Config->TerminalConfig->KeyMapFileName,String);
  2819.  
  2820.             ConfigChanged = TRUE;
  2821.  
  2822.             break;
  2823.  
  2824.         case ATTR_PREFS_TERMINAL_EMULATIONNAME:
  2825.  
  2826.             strcpy(Config->TerminalConfig->EmulationFileName,String);
  2827.  
  2828.             UpdateRequired = ConfigChanged = TRUE;
  2829.  
  2830.             break;
  2831.  
  2832.         case ATTR_PREFS_TERMINAL_FONTNAME:
  2833.  
  2834.             strcpy(Config->TerminalConfig->TextFontName,String);
  2835.  
  2836.             UpdateRequired = ConfigChanged = TRUE;
  2837.  
  2838.             break;
  2839.  
  2840.         case ATTR_PREFS_TERMINAL_USETERMINALPROCESS:
  2841.  
  2842.             Config->TerminalConfig->UseTerminalTask = Number;
  2843.  
  2844.             UpdateRequired = ConfigChanged = TRUE;
  2845.  
  2846.             break;
  2847.  
  2848.         case ATTR_PREFS_TERMINAL_AUTOSIZE:
  2849.  
  2850.             Config->TerminalConfig->AutoSize = Number;
  2851.  
  2852.             UpdateRequired = ConfigChanged = TRUE;
  2853.  
  2854.             break;
  2855.  
  2856.         case ATTR_PREFS_TERMINAL_FONTSIZE:
  2857.  
  2858.             if(Number < 1)
  2859.                 Error = ERROR_BAD_NUMBER;
  2860.             else
  2861.             {
  2862.                 Config->TerminalConfig->TextFontHeight = Number;
  2863.  
  2864.                 UpdateRequired = ConfigChanged = TRUE;
  2865.             }
  2866.  
  2867.             break;
  2868.  
  2869.         case ATTR_PREFS_PATHS_ASCIIUPLOADPATH:
  2870.  
  2871.             strcpy(Config->PathConfig->ASCIIUploadPath,String);
  2872.  
  2873.             ConfigChanged = TRUE;
  2874.  
  2875.             break;
  2876.  
  2877.         case ATTR_PREFS_PATHS_ASCIIDOWNLOADPATH:
  2878.  
  2879.             strcpy(Config->PathConfig->ASCIIDownloadPath,String);
  2880.  
  2881.             ConfigChanged = TRUE;
  2882.  
  2883.             break;
  2884.  
  2885.         case ATTR_PREFS_PATHS_TEXTUPLOADPATH:
  2886.  
  2887.             strcpy(Config->PathConfig->TextUploadPath,String);
  2888.  
  2889.             ConfigChanged = TRUE;
  2890.  
  2891.             break;
  2892.  
  2893.         case ATTR_PREFS_PATHS_TEXTDOWNLOADPATH:
  2894.  
  2895.             strcpy(Config->PathConfig->TextDownloadPath,String);
  2896.  
  2897.             ConfigChanged = TRUE;
  2898.  
  2899.             break;
  2900.  
  2901.         case ATTR_PREFS_PATHS_BINARYUPLOADPATH:
  2902.  
  2903.             strcpy(Config->PathConfig->BinaryUploadPath,String);
  2904.  
  2905.             ConfigChanged = TRUE;
  2906.  
  2907.             break;
  2908.  
  2909.         case ATTR_PREFS_PATHS_BINARYDOWNLOADPATH:
  2910.  
  2911.             strcpy(Config->PathConfig->BinaryDownloadPath,String);
  2912.  
  2913.             ConfigChanged = TRUE;
  2914.  
  2915.             break;
  2916.  
  2917.         case ATTR_PREFS_PATHS_CONFIGPATH:
  2918.  
  2919.             strcpy(Config->PathConfig->DefaultStorage,String);
  2920.  
  2921.             ConfigChanged = TRUE;
  2922.  
  2923.             break;
  2924.  
  2925.         case ATTR_PREFS_PATHS_EDITORNAME:
  2926.  
  2927.             strcpy(Config->PathConfig->Editor,String);
  2928.  
  2929.             ConfigChanged = TRUE;
  2930.  
  2931.             break;
  2932.  
  2933.         case ATTR_PREFS_PATHS_HELPFILENAME:
  2934.  
  2935.             strcpy(Config->PathConfig->HelpFile,String);
  2936.  
  2937.             ConfigChanged = TRUE;
  2938.  
  2939.             break;
  2940.  
  2941.         case ATTR_PREFS_MISC_WAITSTRING:
  2942.  
  2943.             strcpy(Config->MiscConfig->WaitString,String);
  2944.  
  2945.             ConfigChanged = TRUE;
  2946.  
  2947.             break;
  2948.  
  2949.         case ATTR_PREFS_MISC_WAITDELAY:
  2950.  
  2951.             if(Number < 1)
  2952.                 Number = 1;
  2953.             else
  2954.             {
  2955.                 if(Number > 60 * 60)
  2956.                     Number = 60 * 60;
  2957.             }
  2958.  
  2959.             Config->MiscConfig->WaitDelay = Number;
  2960.  
  2961.             ConfigChanged = TRUE;
  2962.  
  2963.             break;
  2964.  
  2965.         case ATTR_PREFS_MISC_ALERTMODE:
  2966.  
  2967.             Config->MiscConfig->AlertMode = Number;
  2968.  
  2969.             ConfigChanged = TRUE;
  2970.  
  2971.             break;
  2972.  
  2973.         case ATTR_PREFS_MISC_REQUESTERMODE:
  2974.  
  2975.             Config->MiscConfig->RequesterMode = Number;
  2976.  
  2977.             ConfigChanged = TRUE;
  2978.  
  2979.             break;
  2980.  
  2981.         case ATTR_PREFS_MISC_REQUESTERWIDTH:
  2982.  
  2983.             if(Number < 80)
  2984.                 Number = 80;
  2985.  
  2986.             Config->MiscConfig->RequesterWidth = Number;
  2987.  
  2988.             ConfigChanged = TRUE;
  2989.  
  2990.             break;
  2991.  
  2992.         case ATTR_PREFS_MISC_REQUESTERHEIGHT:
  2993.  
  2994.             if(Number < 80)
  2995.                 Number = 80;
  2996.  
  2997.             Config->MiscConfig->RequesterHeight = Number;
  2998.  
  2999.             ConfigChanged = TRUE;
  3000.  
  3001.             break;
  3002.  
  3003.         case ATTR_PREFS_MISC_PRIORITY:
  3004.  
  3005.             if(Number < -128)
  3006.                 Number = -128;
  3007.  
  3008.             if(Number > 127)
  3009.                 Number = 127;
  3010.  
  3011.             Config->MiscConfig->Priority = Number;
  3012.  
  3013.             UpdateRequired = ConfigChanged = TRUE;
  3014.  
  3015.             break;
  3016.  
  3017.         case ATTR_PREFS_MISC_BACKUPCONFIG:
  3018.  
  3019.             Config->MiscConfig->BackupConfig = Number;
  3020.  
  3021.             ConfigChanged = TRUE;
  3022.  
  3023.             break;
  3024.  
  3025.         case ATTR_PREFS_MISC_OVERWRITE_WARNING:
  3026.  
  3027.             Config->MiscConfig->ProtectiveMode = Number;
  3028.  
  3029.             ConfigChanged = TRUE;
  3030.  
  3031.             break;
  3032.  
  3033.         case ATTR_PREFS_MISC_SUPPRESSOUTPUT:
  3034.  
  3035.             Config->MiscConfig->SuppressOutput = Number;
  3036.  
  3037.             ConfigChanged = TRUE;
  3038.  
  3039.             break;
  3040.  
  3041.         case ATTR_PREFS_MISC_OPENFASTMACROPANEL:
  3042.  
  3043.             Config->MiscConfig->OpenFastMacroPanel = Number;
  3044.  
  3045.             ConfigChanged = TRUE;
  3046.  
  3047.             break;
  3048.  
  3049.         case ATTR_PREFS_MISC_RELEASEDEVICE:
  3050.  
  3051.             Config->MiscConfig->ReleaseDevice = Number;
  3052.  
  3053.             ConfigChanged = TRUE;
  3054.  
  3055.             break;
  3056.  
  3057.         case ATTR_PREFS_TRANSFER_OVERRIDEPATH:
  3058.         case ATTR_PREFS_MISC_OVERRIDEPATH:
  3059.  
  3060.             Config->TransferConfig->OverridePath = Number;
  3061.  
  3062.             ConfigChanged = TRUE;
  3063.  
  3064.             break;
  3065.  
  3066.         case ATTR_PREFS_MISC_AUTOUPLOAD:
  3067.  
  3068.             Config->MiscConfig->AutoUpload = Number;
  3069.  
  3070.             ConfigChanged = TRUE;
  3071.  
  3072.             break;
  3073.  
  3074.         case ATTR_PREFS_TRANSFER_EXPAND_BLANK_LINES:
  3075.  
  3076.             Config->TransferConfig->ExpandBlankLines = Number;
  3077.  
  3078.             ConfigChanged = TRUE;
  3079.  
  3080.             break;
  3081.  
  3082.         case ATTR_PREFS_TRANSFER_SETARCHIVEDBIT:
  3083.         case ATTR_PREFS_MISC_SETARCHIVEDBIT:
  3084.  
  3085.             Config->TransferConfig->SetArchivedBit = Number;
  3086.  
  3087.             ConfigChanged = TRUE;
  3088.  
  3089.             break;
  3090.  
  3091.         case ATTR_PREFS_TRANSFER_COMMENTMODE:
  3092.         case ATTR_PREFS_MISC_COMMENTMODE:
  3093.  
  3094.             Config->TransferConfig->IdentifyFiles = Number;
  3095.  
  3096.             ConfigChanged = TRUE;
  3097.  
  3098.             break;
  3099.  
  3100.         case ATTR_PREFS_MISC_TRANSFERICONS:
  3101.         case ATTR_PREFS_TRANSFER_TRANSFERICONS:
  3102.  
  3103.             Config->TransferConfig->TransferIcons = Number;
  3104.  
  3105.             ConfigChanged = TRUE;
  3106.  
  3107.             break;
  3108.  
  3109.         case ATTR_PREFS_MISC_CREATEICONS:
  3110.  
  3111.             Config->MiscConfig->CreateIcons = Number;
  3112.  
  3113.             ConfigChanged = TRUE;
  3114.  
  3115.             break;
  3116.  
  3117.         case ATTR_PREFS_MISC_SIMPLEIO:
  3118.  
  3119.             Config->MiscConfig->SimpleIO = Number;
  3120.  
  3121.             ConfigChanged = TRUE;
  3122.  
  3123.             break;
  3124.  
  3125.         case ATTR_PREFS_MISC_HIDE_UPLOAD_ICON:
  3126.         case ATTR_PREFS_TRANSFER_HIDE_UPLOAD_ICON:
  3127.  
  3128.             Config->TransferConfig->HideUploadIcon = Number;
  3129.  
  3130.             ConfigChanged = TRUE;
  3131.  
  3132.             break;
  3133.  
  3134.         case ATTR_PREFS_MISC_TRANSFER_PERFMETER:
  3135.         case ATTR_PREFS_TRANSFER_TRANSFER_PERFMETER:
  3136.  
  3137.             Config->TransferConfig->PerfMeter = Number;
  3138.  
  3139.             ConfigChanged = TRUE;
  3140.  
  3141.             break;
  3142.  
  3143.         case ATTR_PREFS_MISC_IOBUFFERSIZE:
  3144.  
  3145.             if(Number < 1)
  3146.                 Number = 1;
  3147.             else
  3148.             {
  3149.                 if(Number > (1L << 20))
  3150.                     Number = (1L << 20);
  3151.             }
  3152.  
  3153.             for(i = 12 ; i <= 20 ; i++)
  3154.             {
  3155.                 if(Number >= (1L << i) && Number <= (1L << (i + 1)))
  3156.                 {
  3157.                     Number = (1L << i);
  3158.  
  3159.                     break;
  3160.                 }
  3161.             }
  3162.  
  3163.             Config->MiscConfig->IOBufferSize = Number;
  3164.  
  3165.             ConfigChanged = TRUE;
  3166.  
  3167.             break;
  3168.  
  3169.         case ATTR_PREFS_CLIPBOARD_UNIT:
  3170.  
  3171.             if(Number < 0)
  3172.                 Error = TERMERROR_UNIT_NOT_AVAILABLE;
  3173.             else
  3174.             {
  3175.                 Config->ClipConfig->ClipboardUnit = Number;
  3176.  
  3177.                 ConfigChanged = TRUE;
  3178.             }
  3179.  
  3180.             break;
  3181.  
  3182.         case ATTR_PREFS_CLIPBOARD_LINEDELAY:
  3183.  
  3184.             if(Number < 0)
  3185.                 Error = ERROR_BAD_NUMBER;
  3186.             else
  3187.             {
  3188.                 Config->ClipConfig->LineDelay = Number;
  3189.  
  3190.                 ConfigChanged = TRUE;
  3191.             }
  3192.  
  3193.             break;
  3194.  
  3195.         case ATTR_PREFS_CLIPBOARD_CHARDELAY:
  3196.  
  3197.             if(Number < 0)
  3198.                 Error = ERROR_BAD_NUMBER;
  3199.             else
  3200.             {
  3201.                 Config->ClipConfig->CharDelay = Number;
  3202.  
  3203.                 ConfigChanged = TRUE;
  3204.             }
  3205.  
  3206.             break;
  3207.  
  3208.         case ATTR_PREFS_CLIPBOARD_INSERTPREFIXTEXT:
  3209.  
  3210.             strcpy(Config->ClipConfig->InsertPrefix,String);
  3211.  
  3212.             ConfigChanged = TRUE;
  3213.  
  3214.             break;
  3215.  
  3216.         case ATTR_PREFS_CLIPBOARD_INSERTSUFFIXTEXT:
  3217.  
  3218.             strcpy(Config->ClipConfig->InsertSuffix,String);
  3219.  
  3220.             ConfigChanged = TRUE;
  3221.  
  3222.             break;
  3223.  
  3224.         case ATTR_PREFS_CLIPBOARD_LINEPROMPT:
  3225.  
  3226.             strcpy(Config->ClipConfig->LinePrompt,String);
  3227.  
  3228.             ConfigChanged = TRUE;
  3229.  
  3230.             break;
  3231.  
  3232.         case ATTR_PREFS_CLIPBOARD_TEXTPACING:
  3233.  
  3234.             Config->ClipConfig->PacingMode = Number;
  3235.  
  3236.             ConfigChanged = TRUE;
  3237.  
  3238.             break;
  3239.  
  3240.         case ATTR_PREFS_CLIPBOARD_SENDTIMEOUT:
  3241.  
  3242.             Config->ClipConfig->SendTimeout = Number;
  3243.  
  3244.             ConfigChanged = TRUE;
  3245.  
  3246.             break;
  3247.  
  3248.         case ATTR_PREFS_CLIPBOARD_CONVERTLF:
  3249.  
  3250.             Config->ClipConfig->ConvertLF = Number;
  3251.  
  3252.             ConfigChanged = TRUE;
  3253.  
  3254.             break;
  3255.  
  3256.         case ATTR_PREFS_CAPTURE_CONVERTCHARACTERS:
  3257.  
  3258.             Config->CaptureConfig->ConvertChars = Number;
  3259.  
  3260.             ConfigChanged = TRUE;
  3261.  
  3262.             break;
  3263.  
  3264.         case ATTR_PREFS_CAPTURE_BUFFERMODE:
  3265.  
  3266.             Config->CaptureConfig->BufferMode = Number;
  3267.  
  3268.             ConfigChanged = TRUE;
  3269.  
  3270.             break;
  3271.  
  3272.         case ATTR_PREFS_CAPTURE_BUFFERSAFETYMEMORY:
  3273.  
  3274.             Config->CaptureConfig->BufferSafetyMemory = Number;
  3275.  
  3276.             ConfigChanged = TRUE;
  3277.  
  3278.             break;
  3279.  
  3280.         case ATTR_PREFS_CAPTURE_LOGACTIONS:
  3281.  
  3282.             Config->CaptureConfig->LogActions = Number;
  3283.  
  3284.             ConfigChanged = TRUE;
  3285.  
  3286.             break;
  3287.  
  3288.         case ATTR_PREFS_CAPTURE_LOGCALLS:
  3289.  
  3290.             Config->CaptureConfig->LogCall = Number;
  3291.  
  3292.             ConfigChanged = TRUE;
  3293.  
  3294.             break;
  3295.  
  3296.         case ATTR_PREFS_CAPTURE_LOGFILENAME:
  3297.  
  3298.             strcpy(Config->CaptureConfig->LogFileName,String);
  3299.  
  3300.             ConfigChanged = TRUE;
  3301.  
  3302.             break;
  3303.  
  3304.         case ATTR_PREFS_CAPTURE_MAXBUFFERSIZE:
  3305.  
  3306.             if(Number < 0)
  3307.                 Number = 0;
  3308.  
  3309.             Config->CaptureConfig->MaxBufferSize = Number;
  3310.  
  3311.             ConfigChanged = TRUE;
  3312.  
  3313.             break;
  3314.  
  3315.         case ATTR_PREFS_CAPTURE_BUFFER:
  3316.  
  3317.             Config->CaptureConfig->BufferEnabled = Number;
  3318.  
  3319.             ConfigChanged = TRUE;
  3320.  
  3321.             break;
  3322.  
  3323.         case ATTR_PREFS_CAPTURE_CONNECTAUTOCAPTURE:
  3324.  
  3325.             Config->CaptureConfig->ConnectAutoCapture = Number;
  3326.  
  3327.             ConfigChanged = TRUE;
  3328.  
  3329.             break;
  3330.  
  3331.         case ATTR_PREFS_CAPTURE_AUTOCAPTUREDATE:
  3332.  
  3333.             Config->CaptureConfig->AutoCaptureDate = Number;
  3334.  
  3335.             ConfigChanged = TRUE;
  3336.  
  3337.             break;
  3338.  
  3339.         case ATTR_PREFS_CAPTURE_CAPTUREFILTER:
  3340.  
  3341.             Config->CaptureConfig->CaptureFilterMode = Number;
  3342.  
  3343.             ConfigChanged = TRUE;
  3344.  
  3345.             ConOutputUpdate();
  3346.  
  3347.             break;
  3348.  
  3349.         case ATTR_PREFS_CAPTURE_CAPTUREPATH:
  3350.  
  3351.             strcpy(Config->CaptureConfig->CapturePath,String);
  3352.  
  3353.             ConfigChanged = TRUE;
  3354.  
  3355.             break;
  3356.  
  3357.         case ATTR_PREFS_CAPTURE_CALLLOGFILENAME:
  3358.  
  3359.             strcpy(Config->CaptureConfig->CallLogFileName,String);
  3360.  
  3361.             ConfigChanged = TRUE;
  3362.  
  3363.             break;
  3364.  
  3365.         case ATTR_PREFS_CAPTURE_BUFFERSAVEPATH:
  3366.  
  3367.             strcpy(Config->CaptureConfig->BufferPath,String);
  3368.  
  3369.             ConfigChanged = TRUE;
  3370.  
  3371.             break;
  3372.  
  3373.         case ATTR_PREFS_CAPTURE_OPENBUFFERWINDOW:
  3374.  
  3375.             Config->CaptureConfig->OpenBufferWindow = Number;
  3376.  
  3377.             ConfigChanged = TRUE;
  3378.  
  3379.             break;
  3380.  
  3381.         case ATTR_PREFS_CAPTURE_OPENBUFFERSCREEN:
  3382.  
  3383.             Config->CaptureConfig->OpenBufferScreen = Number;
  3384.  
  3385.             ConfigChanged = TRUE;
  3386.  
  3387.             break;
  3388.  
  3389.         case ATTR_PREFS_CAPTURE_BUFFERSCREENPOSITION:
  3390.  
  3391.             Config->CaptureConfig->BufferScreenPosition = Number;
  3392.  
  3393.             ConfigChanged = TRUE;
  3394.  
  3395.             break;
  3396.  
  3397.         case ATTR_PREFS_CAPTURE_BUFFERWIDTH:
  3398.  
  3399.             if(Number < 80)
  3400.                 Number = 80;
  3401.  
  3402.             if(Number > 255)
  3403.                 Number = 255;
  3404.  
  3405.             Config->CaptureConfig->BufferWidth = Number;
  3406.  
  3407.             ConfigChanged = TRUE;
  3408.  
  3409.             break;
  3410.  
  3411.         case ATTR_PREFS_CAPTURE_SEARCH_HISTORY:
  3412.  
  3413.             if(Number < 1)
  3414.                 Number = 1;
  3415.  
  3416.             if(Number > 255)
  3417.                 Number = 255;
  3418.  
  3419.             Config->CaptureConfig->SearchHistory = Number;
  3420.  
  3421.             ConfigChanged = TRUE;
  3422.  
  3423.             break;
  3424.  
  3425.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERWINDOW:
  3426.  
  3427.             Config->CaptureConfig->RememberBufferWindow = Number;
  3428.  
  3429.             ConfigChanged = TRUE;
  3430.  
  3431.             break;
  3432.  
  3433.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERSCREEN:
  3434.  
  3435.             Config->CaptureConfig->RememberBufferScreen = Number;
  3436.  
  3437.             ConfigChanged = TRUE;
  3438.  
  3439.             break;
  3440.  
  3441.         case ATTR_PREFS_FILE_TRANSFERPROTOCOLNAME:
  3442.  
  3443.             strcpy(Config->TransferConfig->DefaultLibrary,String);
  3444.  
  3445.             ConfigChanged = TRUE;
  3446.  
  3447.             TransferUpdateRequired = TRUE;
  3448.  
  3449.             break;
  3450.  
  3451.         case ATTR_PREFS_FILE_TRANSLATIONFILENAME:
  3452.  
  3453.             strcpy(Config->TranslationFileName,String);
  3454.  
  3455.             ConfigChanged = TRUE;
  3456.  
  3457.             break;
  3458.  
  3459.         case ATTR_PREFS_FILE_MACROFILENAME:
  3460.  
  3461.             strcpy(Config->MacroFileName,String);
  3462.  
  3463.             ConfigChanged = TRUE;
  3464.  
  3465.             break;
  3466.  
  3467.         case ATTR_PREFS_FILE_CURSORFILENAME:
  3468.  
  3469.             strcpy(Config->CursorFileName,String);
  3470.  
  3471.             ConfigChanged = TRUE;
  3472.  
  3473.             break;
  3474.  
  3475.         case ATTR_PREFS_FILE_FASTMACROFILENAME:
  3476.  
  3477.             strcpy(Config->FastMacroFileName,String);
  3478.  
  3479.             ConfigChanged = TRUE;
  3480.  
  3481.             break;
  3482.  
  3483.         case ATTR_PREFS_EMULATION_IDENTIFICATION:
  3484.  
  3485.             Config->EmulationConfig->TerminalType = Number;
  3486.  
  3487.             ConfigChanged = TRUE;
  3488.  
  3489.             break;
  3490.  
  3491.         case ATTR_PREFS_EMULATION_CURSORMODE:
  3492.  
  3493.             Config->EmulationConfig->CursorMode = Number;
  3494.  
  3495.             ConfigChanged = TRUE;
  3496.  
  3497.             break;
  3498.  
  3499.         case ATTR_PREFS_EMULATION_MAXSCROLL:
  3500.  
  3501.             if(Number < 0)
  3502.                 Number = 0;
  3503.             else
  3504.             {
  3505.                 if(Number > 255)
  3506.                     Number = 255;
  3507.             }
  3508.  
  3509.             Config->EmulationConfig->MaxScroll = Number;
  3510.  
  3511.             ConfigChanged = TRUE;
  3512.  
  3513.             break;
  3514.  
  3515.         case ATTR_PREFS_EMULATION_MAXJUMP:
  3516.  
  3517.             if(Number < 0)
  3518.                 Number = 0;
  3519.             else
  3520.             {
  3521.                 if(Number > 255)
  3522.                     Number = 255;
  3523.             }
  3524.  
  3525.             Config->EmulationConfig->MaxJump = Number;
  3526.  
  3527.             ConfigChanged = TRUE;
  3528.  
  3529.             break;
  3530.  
  3531.         case ATTR_PREFS_EMULATION_NUMERICMODE:
  3532.  
  3533.             Config->EmulationConfig->NumericMode = Number;
  3534.  
  3535.             ConfigChanged = TRUE;
  3536.  
  3537.             break;
  3538.  
  3539.         case ATTR_PREFS_EMULATION_CURSORWRAP:
  3540.  
  3541.             Config->EmulationConfig->CursorWrap = Number;
  3542.  
  3543.             ConfigChanged = TRUE;
  3544.  
  3545.             break;
  3546.  
  3547.         case ATTR_PREFS_EMULATION_LINEWRAP:
  3548.  
  3549.             Config->EmulationConfig->LineWrap = Number;
  3550.  
  3551.             ConfigChanged = TRUE;
  3552.  
  3553.             break;
  3554.  
  3555.         case ATTR_PREFS_EMULATION_INSERTMODE:
  3556.  
  3557.             Config->EmulationConfig->InsertMode = Number;
  3558.  
  3559.             ConfigChanged = TRUE;
  3560.  
  3561.             break;
  3562.  
  3563.         case ATTR_PREFS_EMULATION_NEWLINEMODE:
  3564.  
  3565.             Config->EmulationConfig->NewLineMode = Number;
  3566.  
  3567.             ConfigChanged = TRUE;
  3568.  
  3569.             break;
  3570.  
  3571.         case ATTR_PREFS_EMULATION_SCROLLMODE:
  3572.  
  3573.             Config->EmulationConfig->ScrollMode = Number;
  3574.  
  3575.             ConfigChanged = TRUE;
  3576.  
  3577.             break;
  3578.  
  3579.         case ATTR_PREFS_EMULATION_DESTRUCTIVEBACKSPACE:
  3580.  
  3581.             Config->EmulationConfig->DestructiveBackspace = Number;
  3582.  
  3583.             ConfigChanged = TRUE;
  3584.  
  3585.             break;
  3586.  
  3587.         case ATTR_PREFS_EMULATION_SWAPBSDELETE:
  3588.  
  3589.             Config->EmulationConfig->SwapBSDelete = Number;
  3590.  
  3591.             ConfigChanged = TRUE;
  3592.  
  3593.             break;
  3594.  
  3595.         case ATTR_PREFS_EMULATION_PRINTERENABLED:
  3596.  
  3597.             Config->EmulationConfig->PrinterEnabled = Number;
  3598.  
  3599.             ConfigChanged = TRUE;
  3600.  
  3601.             break;
  3602.  
  3603.         case ATTR_PREFS_EMULATION_ANSWERBACKTEXT:
  3604.  
  3605.             strcpy(Config->EmulationConfig->AnswerBack,String);
  3606.  
  3607.             ConfigChanged = TRUE;
  3608.  
  3609.             break;
  3610.  
  3611.         case ATTR_PREFS_EMULATION_CLS_RESETS_CURSOR:
  3612.  
  3613.             Config->EmulationConfig->CLSResetsCursor = Number;
  3614.  
  3615.             ConfigChanged = TRUE;
  3616.  
  3617.             break;
  3618.  
  3619.         case ATTR_PREFS_EMULATION_NUMPADLOCKED:
  3620.  
  3621.             Config->EmulationConfig->KeysLocked = Number;
  3622.  
  3623.             ConfigChanged = TRUE;
  3624.  
  3625.             break;
  3626.  
  3627.         case ATTR_PREFS_EMULATION_WRAPLOCKED:
  3628.  
  3629.             Config->EmulationConfig->LockWrapping = Number;
  3630.  
  3631.             ConfigChanged = TRUE;
  3632.  
  3633.             break;
  3634.  
  3635.         case ATTR_PREFS_EMULATION_FONTLOCKED:
  3636.  
  3637.             Config->EmulationConfig->FontLocked = Number;
  3638.  
  3639.             ConfigChanged = TRUE;
  3640.  
  3641.             break;
  3642.  
  3643.         case ATTR_PREFS_EMULATION_CURSORLOCKED:
  3644.  
  3645.             Config->EmulationConfig->CursorLocked = Number;
  3646.  
  3647.             ConfigChanged = TRUE;
  3648.  
  3649.             break;
  3650.  
  3651.         case ATTR_PREFS_EMULATION_STYLELOCKED:
  3652.  
  3653.             Config->EmulationConfig->LockStyle = Number;
  3654.  
  3655.             ConfigChanged = TRUE;
  3656.  
  3657.             break;
  3658.  
  3659.         case ATTR_PREFS_EMULATION_COLOURLOCKED:
  3660.  
  3661.             Config->EmulationConfig->LockColour = Number;
  3662.  
  3663.             ConfigChanged = TRUE;
  3664.  
  3665.             break;
  3666.  
  3667.         case ATTR_PREFS_EMULATION_USEPENS:
  3668.  
  3669.             Config->EmulationConfig->UseStandardPens = Number;
  3670.  
  3671.             UpdateRequired = ConfigChanged = TRUE;
  3672.  
  3673.             break;
  3674.  
  3675.         case ATTR_PREFS_TRANSFER_DEFAULT_LIBRARY:
  3676.  
  3677.             strcpy(Config->TransferConfig->DefaultLibrary,String);
  3678.  
  3679.             ConfigChanged = TRUE;
  3680.  
  3681.             TransferUpdateRequired = TRUE;
  3682.  
  3683.             break;
  3684.  
  3685.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_LIBRARY:
  3686.  
  3687.             strcpy(Config->TransferConfig->ASCIIUploadLibrary,String);
  3688.  
  3689.             UpdateRequired = ConfigChanged = TRUE;
  3690.  
  3691.             break;
  3692.  
  3693.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_LIBRARY:
  3694.  
  3695.             strcpy(Config->TransferConfig->ASCIIDownloadLibrary,String);
  3696.  
  3697.             UpdateRequired = ConfigChanged = TRUE;
  3698.  
  3699.             break;
  3700.  
  3701.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_LIBRARY:
  3702.  
  3703.             strcpy(Config->TransferConfig->TextUploadLibrary,String);
  3704.  
  3705.             UpdateRequired = ConfigChanged = TRUE;
  3706.  
  3707.             break;
  3708.  
  3709.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_LIBRARY:
  3710.  
  3711.             strcpy(Config->TransferConfig->TextDownloadLibrary,String);
  3712.  
  3713.             UpdateRequired = ConfigChanged = TRUE;
  3714.  
  3715.             break;
  3716.  
  3717.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_LIBRARY:
  3718.  
  3719.             strcpy(Config->TransferConfig->BinaryUploadLibrary,String);
  3720.  
  3721.             UpdateRequired = ConfigChanged = TRUE;
  3722.  
  3723.             break;
  3724.  
  3725.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_LIBRARY:
  3726.  
  3727.             strcpy(Config->TransferConfig->BinaryDownloadLibrary,String);
  3728.  
  3729.             UpdateRequired = ConfigChanged = TRUE;
  3730.  
  3731.             break;
  3732.  
  3733.         case ATTR_PREFS_TRANSFER_QUIET_TRANSFER:
  3734.  
  3735.             Config->TransferConfig->QuietTransfer = Number;
  3736.  
  3737.             ConfigChanged = TRUE;
  3738.  
  3739.             break;
  3740.  
  3741.         case ATTR_PREFS_TRANSFER_MANGLE_FILE_NAMES:
  3742.  
  3743.             Config->TransferConfig->MangleFileNames = Number;
  3744.  
  3745.             ConfigChanged = TRUE;
  3746.  
  3747.             break;
  3748.  
  3749.         case ATTR_PREFS_TRANSFER_STRIP_BIT_8:
  3750.  
  3751.             Config->TransferConfig->StripBit8 = Number;
  3752.  
  3753.             ConfigChanged = TRUE;
  3754.  
  3755.             break;
  3756.  
  3757.         case ATTR_PREFS_TRANSFER_IGNORE_DATA_PAST_ARNOLD:
  3758.  
  3759.             Config->TransferConfig->IgnoreDataPastArnold = Number;
  3760.  
  3761.             ConfigChanged = TRUE;
  3762.  
  3763.             break;
  3764.  
  3765.         case ATTR_PREFS_TRANSFER_TERMINATOR_CHAR:
  3766.  
  3767.             if(Number < 0)
  3768.                 Number = 0;
  3769.             else
  3770.             {
  3771.                 if(Number > 255)
  3772.                     Number = 255;
  3773.             }
  3774.  
  3775.             Config->TransferConfig->TerminatorChar = Number;
  3776.  
  3777.             ConfigChanged = TRUE;
  3778.  
  3779.             break;
  3780.  
  3781.         case ATTR_PREFS_TRANSFER_LINEDELAY:
  3782.  
  3783.             if(Number < 0)
  3784.                 Error = ERROR_BAD_NUMBER;
  3785.             else
  3786.             {
  3787.                 Config->TransferConfig->LineDelay = Number;
  3788.  
  3789.                 ConfigChanged = TRUE;
  3790.             }
  3791.  
  3792.             break;
  3793.  
  3794.         case ATTR_PREFS_TRANSFER_CHARDELAY:
  3795.  
  3796.             if(Number < 0)
  3797.                 Error = ERROR_BAD_NUMBER;
  3798.             else
  3799.             {
  3800.                 Config->TransferConfig->CharDelay = Number;
  3801.  
  3802.                 ConfigChanged = TRUE;
  3803.             }
  3804.  
  3805.             break;
  3806.  
  3807.         case ATTR_PREFS_TRANSFER_LINEPROMPT:
  3808.  
  3809.             strcpy(Config->TransferConfig->LinePrompt,String);
  3810.  
  3811.             ConfigChanged = TRUE;
  3812.  
  3813.             break;
  3814.  
  3815.         case ATTR_PREFS_TRANSFER_TEXTPACING:
  3816.  
  3817.             Config->TransferConfig->PacingMode = Number;
  3818.  
  3819.             ConfigChanged = TRUE;
  3820.  
  3821.             break;
  3822.  
  3823.         case ATTR_PREFS_TRANSFER_SENDTIMEOUT:
  3824.  
  3825.             Config->TransferConfig->SendTimeout = Number;
  3826.  
  3827.             ConfigChanged = TRUE;
  3828.  
  3829.             break;
  3830.  
  3831.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_COUNT:
  3832.  
  3833.             Config->TransferConfig->ErrorNotification = Number;
  3834.  
  3835.             ConfigChanged = TRUE;
  3836.  
  3837.             break;
  3838.  
  3839.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_WHEN:
  3840.  
  3841.             Config->TransferConfig->TransferNotification = Number;
  3842.  
  3843.             ConfigChanged = TRUE;
  3844.  
  3845.             break;
  3846.  
  3847.         case ATTR_PREFS_TRANSFER_DEFAULT_TYPE:
  3848.  
  3849.             Config->TransferConfig->DefaultType = Number;
  3850.  
  3851.             ConfigChanged    = TRUE;
  3852.             UpdateRequired    = TRUE;
  3853.  
  3854.             break;
  3855.  
  3856.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_TYPE:
  3857.  
  3858.             Config->TransferConfig->ASCIIUploadType = Number;
  3859.  
  3860.             ConfigChanged    = TRUE;
  3861.             UpdateRequired    = TRUE;
  3862.  
  3863.             break;
  3864.  
  3865.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_TYPE:
  3866.  
  3867.             Config->TransferConfig->ASCIIDownloadType = Number;
  3868.  
  3869.             ConfigChanged    = TRUE;
  3870.             UpdateRequired    = TRUE;
  3871.  
  3872.             break;
  3873.  
  3874.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_TYPE:
  3875.  
  3876.             Config->TransferConfig->TextUploadType = Number;
  3877.  
  3878.             ConfigChanged    = TRUE;
  3879.             UpdateRequired    = TRUE;
  3880.  
  3881.             break;
  3882.  
  3883.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_TYPE:
  3884.  
  3885.             Config->TransferConfig->TextDownloadType = Number;
  3886.  
  3887.             ConfigChanged    = TRUE;
  3888.             UpdateRequired    = TRUE;
  3889.  
  3890.             break;
  3891.  
  3892.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_TYPE:
  3893.  
  3894.             Config->TransferConfig->BinaryUploadType = Number;
  3895.  
  3896.             ConfigChanged    = TRUE;
  3897.             UpdateRequired    = TRUE;
  3898.  
  3899.             break;
  3900.  
  3901.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_TYPE:
  3902.  
  3903.             Config->TransferConfig->BinaryDownloadType = Number;
  3904.  
  3905.             ConfigChanged    = TRUE;
  3906.             UpdateRequired    = TRUE;
  3907.  
  3908.             break;
  3909.  
  3910.         case ATTR_PREFS_TRANSFER_DEFAULT_SEND_SIGNATURE:
  3911.  
  3912.             Config->TransferConfig->Signatures[TRANSFERSIG_DEFAULTUPLOAD].Length = TranslateString(String,Config->TransferConfig->Signatures[TRANSFERSIG_DEFAULTUPLOAD].Signature);
  3913.  
  3914.             ConfigChanged    = TRUE;
  3915.             UpdateRequired    = TRUE;
  3916.  
  3917.             break;
  3918.  
  3919.         case ATTR_PREFS_TRANSFER_DEFAULT_RECEIVE_SIGNATURE:
  3920.  
  3921.             Config->TransferConfig->Signatures[TRANSFERSIG_DEFAULTDOWNLOAD].Length = TranslateString(String,Config->TransferConfig->Signatures[TRANSFERSIG_DEFAULTDOWNLOAD].Signature);
  3922.  
  3923.             ConfigChanged    = TRUE;
  3924.             UpdateRequired    = TRUE;
  3925.  
  3926.             break;
  3927.  
  3928.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_SIGNATURE:
  3929.  
  3930.             Config->TransferConfig->Signatures[TRANSFERSIG_TEXTUPLOAD].Length = TranslateString(String,Config->TransferConfig->Signatures[TRANSFERSIG_TEXTUPLOAD].Signature);
  3931.  
  3932.             ConfigChanged    = TRUE;
  3933.             UpdateRequired    = TRUE;
  3934.  
  3935.             break;
  3936.  
  3937.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_SIGNATURE:
  3938.  
  3939.             Config->TransferConfig->Signatures[TRANSFERSIG_TEXTDOWNLOAD].Length = TranslateString(String,Config->TransferConfig->Signatures[TRANSFERSIG_TEXTDOWNLOAD].Signature);
  3940.  
  3941.             ConfigChanged    = TRUE;
  3942.             UpdateRequired    = TRUE;
  3943.  
  3944.             break;
  3945.  
  3946.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_SIGNATURE:
  3947.  
  3948.             Config->TransferConfig->Signatures[TRANSFERSIG_BINARYUPLOAD].Length = TranslateString(String,Config->TransferConfig->Signatures[TRANSFERSIG_BINARYUPLOAD].Signature);
  3949.  
  3950.             ConfigChanged    = TRUE;
  3951.             UpdateRequired    = TRUE;
  3952.  
  3953.             break;
  3954.  
  3955.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_SIGNATURE:
  3956.  
  3957.             Config->TransferConfig->Signatures[TRANSFERSIG_BINARYDOWNLOAD].Length = TranslateString(String,Config->TransferConfig->Signatures[TRANSFERSIG_BINARYDOWNLOAD].Signature);
  3958.  
  3959.             ConfigChanged    = TRUE;
  3960.             UpdateRequired    = TRUE;
  3961.  
  3962.             break;
  3963.  
  3964.         case ATTR_PREFS_TRANSFER_IDENTIFY_COMMAND:
  3965.  
  3966.             LimitedStrcpy(sizeof(Config->TransferConfig->IdentifyCommand),Config->TransferConfig->IdentifyCommand,String);
  3967.  
  3968.             ConfigChanged = TRUE;
  3969.  
  3970.             break;
  3971.  
  3972.         case ATTR_PREFS_SPEECH_RATE:
  3973.  
  3974.             if(Number < MINRATE)
  3975.                 Number = MINRATE;
  3976.  
  3977.             if(Number > MAXRATE)
  3978.                 Number = MAXRATE;
  3979.  
  3980.             SpeechConfig.Rate = Number;
  3981.  
  3982.             SpeechChanged = TRUE;
  3983.  
  3984.             break;
  3985.  
  3986.         case ATTR_PREFS_SPEECH_PITCH:
  3987.  
  3988.             if(Number < MINPITCH)
  3989.                 Number = MINPITCH;
  3990.  
  3991.             if(Number > MAXPITCH)
  3992.                 Number = MAXPITCH;
  3993.  
  3994.             SpeechConfig.Pitch = Number;
  3995.  
  3996.             SpeechChanged = TRUE;
  3997.  
  3998.             break;
  3999.  
  4000.         case ATTR_PREFS_SPEECH_FREQUENCY:
  4001.  
  4002.             if(Number < MINFREQ)
  4003.                 Number = MINFREQ;
  4004.  
  4005.             if(Number > MAXFREQ)
  4006.                 Number = MAXFREQ;
  4007.  
  4008.             SpeechConfig.Frequency = Number;
  4009.  
  4010.             SpeechChanged = TRUE;
  4011.  
  4012.             break;
  4013.  
  4014.         case ATTR_PREFS_SPEECH_SEXMODE:
  4015.  
  4016.             SpeechConfig.Sex = Number;
  4017.  
  4018.             SpeechChanged = TRUE;
  4019.  
  4020.             break;
  4021.  
  4022.         case ATTR_PREFS_SPEECH_VOLUME:
  4023.  
  4024.             if(Number < 0)
  4025.                 Number = 0;
  4026.  
  4027.             Number = (64 * Number) / 100;
  4028.  
  4029.             if(Number > 64)
  4030.                 Number = 64;
  4031.  
  4032.             SpeechConfig.Volume = Number;
  4033.  
  4034.             SpeechChanged = TRUE;
  4035.  
  4036.             break;
  4037.  
  4038.         case ATTR_PREFS_SPEECH_SPEECH:
  4039.  
  4040.             SpeechConfig.Enabled = Number;
  4041.  
  4042.             SpeechChanged = TRUE;
  4043.  
  4044.             break;
  4045.  
  4046.         case ATTR_PREFS_TRANSLATIONS_X_SEND:
  4047.  
  4048.             if(Count1 < 0 || Count1 > 255)
  4049.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4050.             else
  4051.             {
  4052.                 if(SendTable && *String)
  4053.                 {
  4054.                     struct TranslationEntry *Entry = AllocTranslationEntry(String);
  4055.  
  4056.                     if(Entry)
  4057.                     {
  4058.                         if(SendTable[Count1])
  4059.                             FreeTranslationEntry(SendTable[Count1]);
  4060.  
  4061.                         SendTable[Count1] = Entry;
  4062.  
  4063.                         TranslationChanged = TRUE;
  4064.                     }
  4065.                     else
  4066.                         Error = ERROR_NO_FREE_STORE;
  4067.                 }
  4068.                 else
  4069.                     Error = TERMERROR_NO_DATA_TO_PROCESS;
  4070.             }
  4071.  
  4072.             UpdateRequired = FALSE;
  4073.  
  4074.             break;
  4075.  
  4076.         case ATTR_PREFS_TRANSLATIONS_X_RECEIVE:
  4077.  
  4078.             if(Count1 < 0 || Count1 > 255)
  4079.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4080.             else
  4081.             {
  4082.                 if(ReceiveTable && *String)
  4083.                 {
  4084.                     struct TranslationEntry *Entry;
  4085.  
  4086.                     if(Entry = AllocTranslationEntry(String))
  4087.                     {
  4088.                         if(ReceiveTable[Count1])
  4089.                             FreeTranslationEntry(ReceiveTable[Count1]);
  4090.  
  4091.                         ReceiveTable[Count1] = Entry;
  4092.  
  4093.                         TranslationChanged = TRUE;
  4094.                     }
  4095.                     else
  4096.                         Error = ERROR_NO_FREE_STORE;
  4097.                 }
  4098.                 else
  4099.                     Error = TERMERROR_NO_DATA_TO_PROCESS;
  4100.             }
  4101.  
  4102.             UpdateRequired = FALSE;
  4103.  
  4104.             break;
  4105.  
  4106.         case ATTR_PREFS_FASTMACROS_X_NAME:
  4107.  
  4108.             if(Count1 < FastMacroCount && Count1 >= 0)
  4109.             {
  4110.                 struct MacroNode *Node;
  4111.  
  4112.                 Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  4113.  
  4114.                 strcpy(Node->Macro,String);
  4115.  
  4116.                 FastMacrosChanged = TRUE;
  4117.             }
  4118.             else
  4119.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4120.  
  4121.             UpdateRequired = FALSE;
  4122.  
  4123.             break;
  4124.  
  4125.         case ATTR_PREFS_FASTMACROS_X_CODE:
  4126.  
  4127.             if(Count1 < FastMacroCount && Count1 >= 0)
  4128.             {
  4129.                 struct MacroNode *Node;
  4130.  
  4131.                 Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  4132.  
  4133.                 strcpy(Node->Code,String);
  4134.  
  4135.                 FastMacrosChanged = TRUE;
  4136.             }
  4137.             else
  4138.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4139.  
  4140.             UpdateRequired = FALSE;
  4141.  
  4142.             break;
  4143.  
  4144.         case ATTR_PREFS_HOTKEYS_TERMSCREENTOFRONTTEXT:
  4145.  
  4146.             strcpy(Hotkeys.termScreenToFront,String);
  4147.  
  4148.             HotkeysChanged = TRUE;
  4149.  
  4150.             break;
  4151.  
  4152.         case ATTR_PREFS_HOTKEYS_BUFFERSCREENTOFRONTTEXT:
  4153.  
  4154.             strcpy(Hotkeys.BufferScreenToFront,String);
  4155.  
  4156.             HotkeysChanged = TRUE;
  4157.  
  4158.             break;
  4159.  
  4160.         case ATTR_PREFS_HOTKEYS_SKIPDIALENTRYTEXT:
  4161.  
  4162.             strcpy(Hotkeys.SkipDialEntry,String);
  4163.  
  4164.             HotkeysChanged = TRUE;
  4165.  
  4166.             break;
  4167.  
  4168.         case ATTR_PREFS_HOTKEYS_ABORTAREXX:
  4169.  
  4170.             strcpy(Hotkeys.AbortARexx,String);
  4171.  
  4172.             HotkeysChanged = TRUE;
  4173.  
  4174.             break;
  4175.  
  4176.         case ATTR_PREFS_HOTKEYS_COMMODITYPRIORITY:
  4177.  
  4178.             if(Number < -128)
  4179.                 Number = -128;
  4180.  
  4181.             if(Number > 127)
  4182.                 Number = 127;
  4183.  
  4184.             Hotkeys.CommodityPriority = Number;
  4185.  
  4186.             HotkeysChanged = TRUE;
  4187.  
  4188.             break;
  4189.  
  4190.         case ATTR_PREFS_HOTKEYS_HOTKEYSENABLED:
  4191.  
  4192.             Hotkeys.HotkeysEnabled = Number;
  4193.  
  4194.             HotkeysChanged = TRUE;
  4195.  
  4196.             break;
  4197.  
  4198.         case ATTR_PREFS_CURSORKEYS_UPTEXT:
  4199.  
  4200.             strcpy(CursorKeys->Keys[0][0],String);
  4201.  
  4202.             CursorKeysChanged = TRUE;
  4203.  
  4204.             UpdateRequired = FALSE;
  4205.  
  4206.             break;
  4207.  
  4208.         case ATTR_PREFS_CURSORKEYS_RIGHTTEXT:
  4209.  
  4210.             strcpy(CursorKeys->Keys[0][1],String);
  4211.  
  4212.             CursorKeysChanged = TRUE;
  4213.  
  4214.             UpdateRequired = FALSE;
  4215.  
  4216.             break;
  4217.  
  4218.         case ATTR_PREFS_CURSORKEYS_DOWNTEXT:
  4219.  
  4220.             strcpy(CursorKeys->Keys[0][2],String);
  4221.  
  4222.             CursorKeysChanged = TRUE;
  4223.  
  4224.             UpdateRequired = FALSE;
  4225.  
  4226.             break;
  4227.  
  4228.         case ATTR_PREFS_CURSORKEYS_LEFTTEXT:
  4229.  
  4230.             strcpy(CursorKeys->Keys[0][3],String);
  4231.  
  4232.             CursorKeysChanged = TRUE;
  4233.  
  4234.             UpdateRequired = FALSE;
  4235.  
  4236.             break;
  4237.  
  4238.         case ATTR_PREFS_CURSORKEYS_SHIFT_UPTEXT:
  4239.  
  4240.             strcpy(CursorKeys->Keys[1][0],String);
  4241.  
  4242.             CursorKeysChanged = TRUE;
  4243.  
  4244.             UpdateRequired = FALSE;
  4245.  
  4246.             break;
  4247.  
  4248.         case ATTR_PREFS_CURSORKEYS_SHIFT_RIGHTTEXT:
  4249.  
  4250.             strcpy(CursorKeys->Keys[1][1],String);
  4251.  
  4252.             CursorKeysChanged = TRUE;
  4253.  
  4254.             UpdateRequired = FALSE;
  4255.  
  4256.             break;
  4257.  
  4258.         case ATTR_PREFS_CURSORKEYS_SHIFT_DOWNTEXT:
  4259.  
  4260.             strcpy(CursorKeys->Keys[1][2],String);
  4261.  
  4262.             CursorKeysChanged = TRUE;
  4263.  
  4264.             UpdateRequired = FALSE;
  4265.  
  4266.             break;
  4267.  
  4268.         case ATTR_PREFS_CURSORKEYS_SHIFT_LEFTTEXT:
  4269.  
  4270.             strcpy(CursorKeys->Keys[1][3],String);
  4271.  
  4272.             CursorKeysChanged = TRUE;
  4273.  
  4274.             UpdateRequired = FALSE;
  4275.  
  4276.             break;
  4277.  
  4278.         case ATTR_PREFS_CURSORKEYS_ALT_UPTEXT:
  4279.  
  4280.             strcpy(CursorKeys->Keys[2][0],String);
  4281.  
  4282.             CursorKeysChanged = TRUE;
  4283.  
  4284.             UpdateRequired = FALSE;
  4285.  
  4286.             break;
  4287.  
  4288.         case ATTR_PREFS_CURSORKEYS_ALT_RIGHTTEXT:
  4289.  
  4290.             strcpy(CursorKeys->Keys[2][1],String);
  4291.  
  4292.             CursorKeysChanged = TRUE;
  4293.  
  4294.             UpdateRequired = FALSE;
  4295.  
  4296.             break;
  4297.  
  4298.         case ATTR_PREFS_CURSORKEYS_ALT_DOWNTEXT:
  4299.  
  4300.             strcpy(CursorKeys->Keys[2][2],String);
  4301.  
  4302.             CursorKeysChanged = TRUE;
  4303.  
  4304.             UpdateRequired = FALSE;
  4305.  
  4306.             break;
  4307.  
  4308.         case ATTR_PREFS_CURSORKEYS_ALT_LEFTTEXT:
  4309.  
  4310.             strcpy(CursorKeys->Keys[2][3],String);
  4311.  
  4312.             CursorKeysChanged = TRUE;
  4313.  
  4314.             UpdateRequired = FALSE;
  4315.  
  4316.             break;
  4317.  
  4318.         case ATTR_PREFS_CURSORKEYS_CONTROL_UPTEXT:
  4319.  
  4320.             strcpy(CursorKeys->Keys[3][0],String);
  4321.  
  4322.             CursorKeysChanged = TRUE;
  4323.  
  4324.             UpdateRequired = FALSE;
  4325.  
  4326.             break;
  4327.  
  4328.         case ATTR_PREFS_CURSORKEYS_CONTROL_RIGHTTEXT:
  4329.  
  4330.             strcpy(CursorKeys->Keys[3][1],String);
  4331.  
  4332.             CursorKeysChanged = TRUE;
  4333.  
  4334.             UpdateRequired = FALSE;
  4335.  
  4336.             break;
  4337.  
  4338.         case ATTR_PREFS_CURSORKEYS_CONTROL_DOWNTEXT:
  4339.  
  4340.             strcpy(CursorKeys->Keys[3][2],String);
  4341.  
  4342.             CursorKeysChanged = TRUE;
  4343.  
  4344.             UpdateRequired = FALSE;
  4345.  
  4346.             break;
  4347.  
  4348.         case ATTR_PREFS_CURSORKEYS_CONTROL_LEFTTEXT:
  4349.  
  4350.             strcpy(CursorKeys->Keys[3][3],String);
  4351.  
  4352.             CursorKeysChanged = TRUE;
  4353.  
  4354.             UpdateRequired = FALSE;
  4355.  
  4356.             break;
  4357.  
  4358.         case ATTR_PREFS_FUNCTIONKEYS_X:
  4359.  
  4360.             if(Count1 >= 1 && Count1 <= 10)
  4361.             {
  4362.                 strcpy(MacroKeys->Keys[0][Count1 - 1],String);
  4363.  
  4364.                 MacroChanged = TRUE;
  4365.             }
  4366.             else
  4367.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4368.  
  4369.             UpdateRequired = FALSE;
  4370.  
  4371.             break;
  4372.  
  4373.         case ATTR_PREFS_FUNCTIONKEYS_SHIFT_X:
  4374.  
  4375.             if(Count1 >= 1 && Count1 <= 10)
  4376.             {
  4377.                 strcpy(MacroKeys->Keys[1][Count1 - 1],String);
  4378.  
  4379.                 MacroChanged = TRUE;
  4380.             }
  4381.             else
  4382.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4383.  
  4384.             UpdateRequired = FALSE;
  4385.  
  4386.             break;
  4387.  
  4388.         case ATTR_PREFS_FUNCTIONKEYS_ALT_X:
  4389.  
  4390.             if(Count1 >= 1 && Count1 <= 10)
  4391.             {
  4392.                 strcpy(MacroKeys->Keys[2][Count1 - 1],String);
  4393.  
  4394.                 MacroChanged = TRUE;
  4395.             }
  4396.             else
  4397.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4398.  
  4399.             UpdateRequired = FALSE;
  4400.  
  4401.             break;
  4402.  
  4403.         case ATTR_PREFS_FUNCTIONKEYS_CONTROL_X:
  4404.  
  4405.             if(Count1 >= 1 && Count1 <= 10)
  4406.             {
  4407.                 strcpy(MacroKeys->Keys[3][Count1 - 1],String);
  4408.  
  4409.                 MacroChanged = TRUE;
  4410.             }
  4411.             else
  4412.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4413.  
  4414.             UpdateRequired = FALSE;
  4415.  
  4416.             break;
  4417.  
  4418.         case ATTR_PREFS_PROTOCOL:
  4419.  
  4420.             strcpy(ProtocolOptsBuffer,String);
  4421.  
  4422.             TransferUpdateRequired = TRUE;
  4423.  
  4424.             UpdateRequired = FALSE;
  4425.  
  4426.             break;
  4427.  
  4428.         case ATTR_PREFS_MISC_CONSOLEWINDOW:
  4429.         case ATTR_PREFS_CONSOLE:
  4430.  
  4431.             strcpy(Config->MiscConfig->WindowName,String);
  4432.  
  4433.             ConfigChanged = TRUE;
  4434.  
  4435.             UpdateRequired = FALSE;
  4436.  
  4437.             break;
  4438.  
  4439.         case ATTR_PREFS_SOUND_BELLNAME:
  4440.  
  4441.             strcpy(SoundConfig.BellFile,String);
  4442.  
  4443.             SoundChanged = TRUE;
  4444.  
  4445.             break;
  4446.  
  4447.         case ATTR_PREFS_SOUND_ERROR:
  4448.  
  4449.             strcpy(SoundConfig.ErrorNotifyFile,String);
  4450.  
  4451.             SoundChanged = TRUE;
  4452.  
  4453.             break;
  4454.  
  4455.         case ATTR_PREFS_SOUND_CONNECTNAME:
  4456.  
  4457.             strcpy(SoundConfig.ConnectFile,String);
  4458.  
  4459.             SoundChanged = TRUE;
  4460.  
  4461.             break;
  4462.  
  4463.         case ATTR_PREFS_SOUND_DISCONNECTNAME:
  4464.  
  4465.             strcpy(SoundConfig.DisconnectFile,String);
  4466.  
  4467.             SoundChanged = TRUE;
  4468.  
  4469.             break;
  4470.  
  4471.         case ATTR_PREFS_SOUND_GOODTRANSFERNAME:
  4472.  
  4473.             strcpy(SoundConfig.GoodTransferFile,String);
  4474.  
  4475.             SoundChanged = TRUE;
  4476.  
  4477.             break;
  4478.  
  4479.         case ATTR_PREFS_SOUND_BADTRANSFERNAME:
  4480.  
  4481.             strcpy(SoundConfig.BadTransferFile,String);
  4482.  
  4483.             SoundChanged = TRUE;
  4484.  
  4485.             break;
  4486.  
  4487.         case ATTR_PREFS_SOUND_RINGNAME:
  4488.  
  4489.             strcpy(SoundConfig.RingFile,String);
  4490.  
  4491.             SoundChanged = TRUE;
  4492.  
  4493.             break;
  4494.  
  4495.         case ATTR_PREFS_SOUND_VOICENAME:
  4496.  
  4497.             strcpy(SoundConfig.VoiceFile,String);
  4498.  
  4499.             SoundChanged = TRUE;
  4500.  
  4501.             break;
  4502.  
  4503.         case ATTR_PREFS_SOUND_PRELOAD:
  4504.  
  4505.             SoundConfig.Preload = Number;
  4506.  
  4507.             SoundChanged = TRUE;
  4508.  
  4509.             break;
  4510.  
  4511.         case ATTR_PREFS_SOUND_VOLUME:
  4512.  
  4513.             if(Number < 0)
  4514.                 Number = 0;
  4515.             else
  4516.             {
  4517.                 if(Number > 100)
  4518.                     Number = 100;
  4519.             }
  4520.  
  4521.             SoundConfig.Volume = Number;
  4522.  
  4523.             SoundChanged = TRUE;
  4524.  
  4525.             break;
  4526.     }
  4527.  
  4528.     if(Error)
  4529.         UpdateRequired = FALSE;
  4530.  
  4531.     return(Error);
  4532. }
  4533.  
  4534.     /* Cheapo shortcut :-) */
  4535.  
  4536. #define Args        Pkt->Array
  4537. #define ResultCode    Pkt->Results
  4538.  
  4539.     /* RexxGetAttr(struct RexxPkt *Pkt):
  4540.      *
  4541.      *    Get some global variable(s). Care to rewrite this beastie to
  4542.      *    work recursively?
  4543.      */
  4544.  
  4545. STRPTR
  4546. RexxGetAttr(struct RexxPkt *Pkt)
  4547. {
  4548.     enum    {    ARG_GETATTR_OBJECT,ARG_GETATTR_FIELD,ARG_GETATTR_STEM,
  4549.                 ARG_GETATTR_VAR };
  4550.  
  4551.     WORD Index,Count1,Count2;
  4552.     UBYTE SrcName[160];
  4553.  
  4554.     if(Args[ARG_GETATTR_FIELD])
  4555.         LimitedSPrintf(sizeof(SrcName),SrcName,"%s.%s",Args[ARG_GETATTR_OBJECT],Args[ARG_GETATTR_FIELD]);
  4556.     else
  4557.         strcpy(SrcName,Args[ARG_GETATTR_OBJECT]);
  4558.  
  4559.     DB(kprintf("srcname=|%s|\n",SrcName));
  4560.  
  4561.     if((Index = ToIndex(SrcName,&Count1,&Count2)) == -1)
  4562.     {
  4563.         DB(kprintf("->unknown object\n"));
  4564.  
  4565.         ResultCode[0] = RC_ERROR;
  4566.         ResultCode[1] = TERMERROR_UNKNOWN_OBJECT;
  4567.     }
  4568.     else
  4569.     {
  4570.         UBYTE DstName[160];
  4571.  
  4572.         DB(kprintf("item is index=%ld count1=%ld count2=%ld name |%s|\n",Index,Count1,Count2,AttributeTable[Index].Name ? AttributeTable[Index].Name : (STRPTR)"«NULL»"));
  4573.  
  4574.         if(AttributeTable[Index].Type == INFO_STEM)
  4575.         {
  4576.             DB(kprintf("this is a stem variable\n"));
  4577.  
  4578.             if(!Args[ARG_GETATTR_STEM])
  4579.             {
  4580.                 DB(kprintf("->no stem var provided\n"));
  4581.  
  4582.                 ResultCode[0] = RC_ERROR;
  4583.                 ResultCode[1] = TERMERROR_RESULT_VARIABLE_REQUIRED;
  4584.             }
  4585.             else
  4586.             {
  4587.                 LONG Level,Max,Min;
  4588.                 STRPTR Result;
  4589.  
  4590.                 Max = 0;
  4591.                 Min = 0;
  4592.  
  4593.                 strcpy(DstName,Args[ARG_GETATTR_STEM]);
  4594.  
  4595.                 DB(kprintf("dstname=|%s|\n",DstName));
  4596.  
  4597.                 Level = AttributeTable[Index].Level;
  4598.  
  4599.                 DB(kprintf("list level %ld\n",Level));
  4600.  
  4601.                 do
  4602.                 {
  4603.                     if(AttributeTable[Index].Name)
  4604.                     {
  4605.                         if(AttributeTable[Index].Type != INFO_STEM)
  4606.                         {
  4607.                             Forbid();
  4608.  
  4609.                             DB(kprintf("reading item |%s|\n",AttributeTable[Index].Name));
  4610.  
  4611.                             if(ResultCode[1] = GetSingleAttribute(AttributeTable[Index].NodeID,Index,Count1,&Result))
  4612.                             {
  4613.                                 DB(kprintf("->error reading it\n"));
  4614.  
  4615.                                 ResultCode[0] = RC_ERROR;
  4616.  
  4617.                                 Permit();
  4618.  
  4619.                                 break;
  4620.                             }
  4621.                             else
  4622.                             {
  4623.                                 if(!AttributeTable[Index + 1].Name)
  4624.                                     Max = Atol(Result);
  4625.  
  4626.                                 DB(kprintf("storing in |%s.%s|\n",DstName,FromIndex(Index,Count1,0,FALSE)));
  4627.  
  4628.                                 if(!CreateVarArgs(Result,Pkt,"%s.%s",DstName,FromIndex(Index,Count1,0,FALSE)))
  4629.                                 {
  4630.                                     DB(kprintf("->could not create var\n"));
  4631.  
  4632.                                     Permit();
  4633.  
  4634.                                     break;
  4635.                                 }
  4636.                             }
  4637.  
  4638.                             Permit();
  4639.                         }
  4640.                         else
  4641.                         {
  4642.                             if(!AttributeTable[Index + 1].Name)
  4643.                             {
  4644.                                     /* Special cases! */
  4645.  
  4646.                                 switch(AttributeTable[Index].NodeID)
  4647.                                 {
  4648.                                     case ATTR_PREFS_TRANSLATIONS:
  4649.  
  4650.                                         Max = 256;
  4651.                                         break;
  4652.  
  4653.                                     case ATTR_PREFS_FUNCTIONKEYS:
  4654.                                     case ATTR_PREFS_FUNCTIONKEYS_SHIFT:
  4655.                                     case ATTR_PREFS_FUNCTIONKEYS_ALT:
  4656.                                     case ATTR_PREFS_FUNCTIONKEYS_CONTROL:
  4657.  
  4658.                                         Max = 11;
  4659.                                         Min = 1;
  4660.                                         break;
  4661.  
  4662.                                     default:
  4663.  
  4664.                                         Forbid();
  4665.  
  4666.                                         if(ResultCode[1] = GetSingleAttribute(AttributeTable[Index].NodeID,Index,Count1,&Result))
  4667.                                         {
  4668.                                             Permit();
  4669.  
  4670.                                             ResultCode[0] = RC_ERROR;
  4671.  
  4672.                                             break;
  4673.                                         }
  4674.                                         else
  4675.                                             Max = Atol(Result);
  4676.  
  4677.                                         Permit();
  4678.  
  4679.                                         break;
  4680.                                 }
  4681.                             }
  4682.                         }
  4683.                     }
  4684.                     else
  4685.                     {
  4686.                         LONG i,j;
  4687.  
  4688.                         DB(kprintf("reading items %ld through %ld\n",Min,Max - 1));
  4689.  
  4690.                         for(i = Min ; i < Max ; i++)
  4691.                         {
  4692.                             j = 0;
  4693.  
  4694.                             do
  4695.                             {
  4696.                                 if(AttributeTable[Index + j].Type != INFO_STEM)
  4697.                                 {
  4698.                                     Forbid();
  4699.  
  4700.                                     DB(kprintf("reading item %ld\n",AttributeTable[Index + j].NodeID));
  4701.  
  4702.                                     if(ResultCode[1] = GetSingleAttribute(AttributeTable[Index + j].NodeID,Index + j,i,&Result))
  4703.                                     {
  4704.                                         DB(kprintf("->error reading it\n"));
  4705.  
  4706.                                         Permit();
  4707.  
  4708.                                         ResultCode[0] = RC_ERROR;
  4709.  
  4710.                                         break;
  4711.                                     }
  4712.                                     else
  4713.                                     {
  4714.                                         DB(kprintf("storing it in |%s.%s|\n",DstName,FromIndex(Index + j,i,0,FALSE)));
  4715.  
  4716.                                         if(!CreateVarArgs(Result,Pkt,"%s.%s",DstName,FromIndex(Index + j,i,0,FALSE)))
  4717.                                         {
  4718.                                             Permit();
  4719.  
  4720.                                             break;
  4721.                                         }
  4722.                                     }
  4723.  
  4724.                                     Permit();
  4725.                                 }
  4726.  
  4727.                                 j++;
  4728.                             }
  4729.                             while(AttributeTable[Index + j].Level > Level && !ResultCode[0]);
  4730.                         }
  4731.  
  4732.                         while(AttributeTable[Index + 1].Level > Level)
  4733.                             Index++;
  4734.  
  4735.                         Min = 0;
  4736.  
  4737.                         if(ResultCode[0])
  4738.                             break;
  4739.                     }
  4740.  
  4741.                     Index++;
  4742.                 }
  4743.                 while(Index < AttributeTableSize && AttributeTable[Index].Level > Level);
  4744.             }
  4745.         }
  4746.         else
  4747.         {
  4748.             STRPTR Result;
  4749.  
  4750.             if(Args[ARG_GETATTR_STEM])
  4751.                 LimitedSPrintf(sizeof(DstName),DstName,"%s.%s",Args[ARG_GETATTR_STEM],SrcName);
  4752.             else
  4753.             {
  4754.                 if(Args[ARG_GETATTR_VAR])
  4755.                     strcpy(DstName,Args[ARG_GETATTR_VAR]);
  4756.                 else
  4757.                     DstName[0] = 0;
  4758.             }
  4759.  
  4760.             DB(kprintf("dstname=|%s|\n",DstName));
  4761.  
  4762.             Forbid();
  4763.  
  4764.             if(ResultCode[1] = GetSingleAttribute(AttributeTable[Index].NodeID,Index,Count1,&Result))
  4765.             {
  4766.                 ResultCode[0] = RC_ERROR;
  4767.                 DB(kprintf("->could not read attr\n"));
  4768.             }
  4769.             else
  4770.             {
  4771.                 if(DstName[0])
  4772.                 {
  4773.                     DB(kprintf("storing in variable |%s|\n",DstName));
  4774.                     CreateVar(Result,Pkt,DstName);
  4775.                 }
  4776.                 else
  4777.                 {
  4778.                     Permit();
  4779.  
  4780.                     DB(kprintf("returning in |RESULT|\n"));
  4781.  
  4782.                     return(CreateResult(Result,ResultCode));
  4783.                 }
  4784.             }
  4785.  
  4786.             Permit();
  4787.         }
  4788.     }
  4789.  
  4790.     return(NULL);
  4791. }
  4792.  
  4793.     /* RexxSetAttr(struct RexxPkt *Pkt):
  4794.      *
  4795.      *    Set some global variable(s). Care to rewrite this beastie to
  4796.      *    work recursively?
  4797.      */
  4798.  
  4799. STRPTR
  4800. RexxSetAttr(struct RexxPkt *Pkt)
  4801. {
  4802.     enum    {    ARG_SETATTR_OBJECT,ARG_SETATTR_FIELD,ARG_SETATTR_STEM,
  4803.                 ARG_SETATTR_VAR };
  4804.  
  4805.     WORD Index,Count1,Count2;
  4806.     UBYTE SrcName[160];
  4807.  
  4808.     if(Args[ARG_SETATTR_FIELD])
  4809.         LimitedSPrintf(sizeof(SrcName),SrcName,"%s.%s",Args[ARG_SETATTR_OBJECT],Args[ARG_SETATTR_FIELD]);
  4810.     else
  4811.         strcpy(SrcName,Args[ARG_SETATTR_OBJECT]);
  4812.  
  4813.     if((Index = ToIndex(SrcName,&Count1,&Count2)) == -1)
  4814.     {
  4815.         ResultCode[0] = RC_ERROR;
  4816.         ResultCode[1] = TERMERROR_UNKNOWN_OBJECT;
  4817.     }
  4818.     else
  4819.     {
  4820.         if(AttributeTable[Index].ReadOnly)
  4821.         {
  4822.             ResultCode[0] = RC_ERROR;
  4823.             ResultCode[1] = TERMERROR_INFORMATION_IS_READ_ONLY;
  4824.         }
  4825.         else
  4826.         {
  4827.             UBYTE DstName[160];
  4828.  
  4829.             if(AttributeTable[Index].Type == INFO_STEM)
  4830.             {
  4831.                 if(!Args[ARG_SETATTR_STEM])
  4832.                 {
  4833.                     ResultCode[0] = RC_ERROR;
  4834.                     ResultCode[1] = TERMERROR_RESULT_VARIABLE_REQUIRED;
  4835.                 }
  4836.                 else
  4837.                 {
  4838.                     UBYTE FullName[160];
  4839.                     LONG Level,Max,Min;
  4840.                     STRPTR Result;
  4841.  
  4842.                     Max = 0;
  4843.                     Min = 0;
  4844.  
  4845.                     strcpy(DstName,Args[ARG_SETATTR_STEM]);
  4846.  
  4847.                     Level = AttributeTable[Index].Level;
  4848.  
  4849.                     do
  4850.                     {
  4851.                         if(AttributeTable[Index].Name)
  4852.                         {
  4853.                             if(!AttributeTable[Index + 1].Name)
  4854.                             {
  4855.                                 if(AttributeTable[Index].Type == INFO_STEM)
  4856.                                 {
  4857.                                         /* Special cases! */
  4858.  
  4859.                                     switch(AttributeTable[Index].NodeID)
  4860.                                     {
  4861.                                         case ATTR_PREFS_TRANSLATIONS:
  4862.  
  4863.                                             Max = 256;
  4864.                                             break;
  4865.  
  4866.                                         case ATTR_PREFS_FUNCTIONKEYS:
  4867.                                         case ATTR_PREFS_FUNCTIONKEYS_SHIFT:
  4868.                                         case ATTR_PREFS_FUNCTIONKEYS_ALT:
  4869.                                         case ATTR_PREFS_FUNCTIONKEYS_CONTROL:
  4870.  
  4871.                                             Max = 11;
  4872.                                             Min = 1;
  4873.                                             break;
  4874.  
  4875.                                         default:
  4876.  
  4877.                                             Max = 0;
  4878.                                             break;
  4879.                                     }
  4880.                                 }
  4881.                                 else
  4882.                                     Max = 0;
  4883.  
  4884.                                 if(!Max)
  4885.                                 {
  4886.                                     Forbid();
  4887.  
  4888.                                     if(ResultCode[1] = GetSingleAttribute(AttributeTable[Index].NodeID,Index,Count1,&Result))
  4889.                                     {
  4890.                                         Permit();
  4891.  
  4892.                                         ResultCode[0] = RC_ERROR;
  4893.  
  4894.                                         break;
  4895.                                     }
  4896.                                     else
  4897.                                         Max = Atol(Result);
  4898.  
  4899.                                     Permit();
  4900.                                 }
  4901.                             }
  4902.  
  4903.                             if(AttributeTable[Index].Type != INFO_STEM)
  4904.                             {
  4905.                                 LimitedSPrintf(sizeof(FullName),FullName,"%s.%s",DstName,FromIndex(Index,Count1,0,FALSE));
  4906.  
  4907.                                 if(!GetRexxVar((struct Message *)Pkt->RexxMsg,FullName,&Result))
  4908.                                 {
  4909.                                     if(ResultCode[1] = SetSingleAttribute(AttributeTable[Index].NodeID,Index,Count1,Result))
  4910.                                     {
  4911.                                         ResultCode[0] = RC_ERROR;
  4912.  
  4913.                                         break;
  4914.                                     }
  4915.                                 }
  4916.                                 else
  4917.                                     ResultCode[0] = RC_ERROR;
  4918.                             }
  4919.                         }
  4920.                         else
  4921.                         {
  4922.                             LONG i,j;
  4923.  
  4924.                             for(i = Min ; i < Max ; i++)
  4925.                             {
  4926.                                 j = 0;
  4927.  
  4928.                                 do
  4929.                                 {
  4930.                                     if(AttributeTable[Index + j].Type != INFO_STEM)
  4931.                                     {
  4932.                                         LimitedSPrintf(sizeof(FullName),FullName,"%s.%s",DstName,FromIndex(Index + j,i,0,FALSE));
  4933.  
  4934.                                         if(!GetRexxVar((struct Message *)Pkt->RexxMsg,FullName,&Result))
  4935.                                         {
  4936.                                             if(ResultCode[1] = SetSingleAttribute(AttributeTable[Index + j].NodeID,Index + j,i,Result))
  4937.                                             {
  4938.                                                 ResultCode[0] = RC_ERROR;
  4939.  
  4940.                                                 break;
  4941.                                             }
  4942.                                         }
  4943.                                         else
  4944.                                             ResultCode[0] = RC_ERROR;
  4945.                                     }
  4946.  
  4947.                                     j++;
  4948.                                 }
  4949.                                 while(AttributeTable[Index + j].Level > Level && !ResultCode[0]);
  4950.                             }
  4951.  
  4952.                             while(AttributeTable[Index + 1].Level > Level)
  4953.                                 Index++;
  4954.  
  4955.                             Min = 0;
  4956.  
  4957.                             if(ResultCode[0])
  4958.                                 break;
  4959.                         }
  4960.  
  4961.                         Index++;
  4962.                     }
  4963.                     while(Index < AttributeTableSize && AttributeTable[Index].Level > Level);
  4964.                 }
  4965.             }
  4966.             else
  4967.             {
  4968.                 STRPTR Result;
  4969.  
  4970.                 if(Args[ARG_SETATTR_STEM])
  4971.                 {
  4972.                     LimitedSPrintf(sizeof(DstName),DstName,"%s.%s",Args[ARG_SETATTR_STEM],SrcName);
  4973.  
  4974.                     if(!GetRexxVar((struct Message *)Pkt->RexxMsg,DstName,&Result))
  4975.                     {
  4976.                         if(ResultCode[1] = SetSingleAttribute(AttributeTable[Index].NodeID,Index,Count1,Result))
  4977.                             ResultCode[0] = RC_ERROR;
  4978.                     }
  4979.                     else
  4980.                         ResultCode[0] = RC_ERROR;
  4981.                 }
  4982.                 else
  4983.                 {
  4984.                     if(ResultCode[1] = SetSingleAttribute(AttributeTable[Index].NodeID,Index,Count1,Args[ARG_SETATTR_VAR]))
  4985.                         ResultCode[0] = RC_ERROR;
  4986.                 }
  4987.             }
  4988.         }
  4989.     }
  4990.  
  4991.     return(NULL);
  4992. }
  4993.